Deploy de uma aplicação Django no Pythonanywhere
Links da documentação oficial:
https://docs.djangoproject.com/pt-br/1.11/intro/reusable-apps/
Para baixar o código como está até agora, acesse o meu github no link abaixo:
https://github.com/toticavalcanti/django_course/tree/deploy
DEPLOY
Comandos usados na aula:
Para criar o ambiente virtual dentro do pythonanywhere.
mkvirtualenv --python=/usr/bin/python3.6 myenv
Para clonar o projeto do github para dentro do pythonanywhere, você deve trocar o nome da branch para master, onde tá com a cor verde e o endereço do seu repositório, onde tá marcado com a cor laranja, para o endereço do seu repositório no seu github.
git clone -b deploy git@github.com:toticavalcanti/django_course.git
Para instalar as dependências, inclusive a app Polls.
pip install -r requirements.txt
Para coletar os arquivos estáticos do projeto, css, html, js…
python manage.py collectstatic
Para fazer as migrations
python manage.py migrate
Para fazer criar um super usuário
python manage.py createsuperuser
Existem três arquivos na pasta settings:
- production.py que é a configuração para um servidor de produção
- local.py que é a configuração para um servidor de desenvolvimento
- base.py que é uma duplicata de local.py para que outros desenvolvedores possam usá-lo em suas máquinas.
Isso significa que o python manage.py runserver
será executado com sua configuração production.py por padrão.
O base.py é importado para incluir quaisquer configurações ausentes acidentalmente, mas o production.py sobrescreverá quaisquer configurações necessárias à produção.
CONTEÚDOS DOS ARQUIVOS DA PASTA django_course/mysite/settings/
Conteúdo do __init__.py
from .base import *
from .production import *
try:
from .local import *
except:
pass
O que o __init__.py faz é sobrescrever production.py se local.py estiver presente. Isso significa que você terá que atualizar o seu arquivo .gitignore para ter o local.py incluído, para que você não faça o push dele para o servidor, ou github.
Conteúdo do base.py
"""
Django settings for mysite project.
Generated by 'django-admin startproject' using Django 2.2.dev20180724223558.
For more information on this file, see
https://docs.djangoproject.com/en/dev/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/dev/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/dev/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '&^cby$$v@)@sl*xh03kw(w5bp&b3x#9g=-(l5a4zu$%qn%3ga-'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ['127.0.0.1:8000']
# Application definition
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'mysite.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'mysite.wsgi.application'
# Database
# https://docs.djangoproject.com/en/dev/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db_mysite',
'USER': 'django',
'PASSWORD': '123456',
'HOST': 'localhost', # Or an IP Address that your DB is hosted on
'PORT': '3306',
}
}
# Password validation
# https://docs.djangoproject.com/en/dev/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/dev/topics/i18n/
LANGUAGE_CODE = 'pt-br'
TIME_ZONE = 'America/Sao_Paulo'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/dev/howto/static-files/
STATIC_URL = '/static/'
Conteúdo do production.py
"""
Django settings for mysite project.
Generated by 'django-admin startproject' using Django 2.2.dev20180724223558.
For more information on this file, see
https://docs.djangoproject.com/en/dev/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/dev/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/dev/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ.get('SECRET_KEY', '&^cby$$v@)@sl*xh03kw(w5bp&b3x#9g=-(l5a4zu$%qn%3ga-')
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ['toticavalcanti.pythonanywhere.com', '127.0.0.1', 'localhost','polls-research.herokuapp.com', '.polls.com']
# Application definition
INSTALLED_APPS = [
'polls',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'mysite.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'mysite.wsgi.application'
# Database
# https://docs.djangoproject.com/en/dev/ref/settings/#databases
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.mysql',
# 'NAME': 'db_mysite',
# 'USER': 'django',
# 'PASSWORD': '123456',
# 'HOST': 'localhost', # Or an IP Address that your DB is hosted on
# 'PORT': '3306',
# }
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# add this
import dj_database_url
db_from_env = dj_database_url.config()
DATABASES['default'].update(db_from_env)
#DATABASES['default']['CONN_MAX_AGE'] = 500
# Password validation
# https://docs.djangoproject.com/en/dev/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/dev/topics/i18n/
LANGUAGE_CODE = 'pt-br'
TIME_ZONE = 'America/Sao_Paulo'
USE_I18N = True
USE_L10N = True
USE_TZ = True
STATIC_URL = '/static/'
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/dev/howto/static-files/
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# Extra places for collectstatic to find static files.
#STATICFILES_DIRS = (
# os.path.join(os.path.normpath(BASE_DIR), "static"),
#)
Para baixar o código como está até agora, acesse o meu github no link abaixo:
https://github.com/toticavalcanti/django_course/tree/deploy
AULA 28
AULA 30
Todas as Aulas da App Polls
Página Principal
OBRIGADO E BONS ESTUDOS
Massa!!! Cara era isso que estava precisando pra desmistificar o deploy da aplicação Django, estava com problemas para consertar alguns erros que ocorria na versão 2.7 do python. Segui essa forma e funcionou perfeitamente. Muito obrigado.
Que legal Denny, fico feliz que as aulas te ajudaram. Sucesso e bons estudos 🙂 \O/
Boa tarde toticavalcanti estou com um probleminha na hora de rodar o site… ele tá dando uma msg de erro. Eu estive seguindo os passos q vc colocou no tutorial…
no log ele está dizendo q não está encontrando o django, mas quando eu vou no bash da venv eu consigo fazer a importação do django…
Fala Adriel, blz? Estranho esse erro, você conseguiu rodar algum comando com o manage.py?
Saudações Toti. Estou tendo erro de acesso ao banco de dados. A mensagem de erro é (2002, “Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)”)
Sabe me dizer o que estou fazendo de errado e como corrigir?
Desde já agradeço.