20
loading...
This website collects cookies to deliver better user experience
En tu sistema de archivos, crea una carpeta para tu proyecto, puedes llamarla como tu quieras, en este ejemplo la llamaremos proyecto_django
.
Abre tu consola desde la ubicación de tu carpeta proyecto_django
y ejecuta el siguiente comando para inicializar un repositorio de Git:
git init
.gitignore
, que permitirá ignorar archivos que no queremos darle un seguimiento a través del sistema control de versiones, estos pueden ser archivos de configuración, que contienen datos sensibles como contraseñas, archivos binarios, como imágenes, ya que suelen ser muy pesados, archivos de compilación de Python (.pyc
), etc.Abre la carpeta de tu proyecto desde Visual Studio Code, ya sea ejecutando el comando code .
desde tu consola o abriendo Visual Studio Code y en la opción File > Open Folder.
Crea el archivo .gitignore
en la raíz de la carpeta del proyecto, y no olvides agregar el punto (.
) al principio del nombre.
.gitignore
contendrá una lista de todos los archivos que vamos a ignorar, y para crear esa lista nos apoyaremos de la página https://gitignore.io que nos facilitará la creación de este archivo pasándole un conjunto de etiquetas de todas las herramientas que utilizaremos.VisualStudioCode
, Python
y Django
:.gitignore
.venv
(asegurate de tener instalado Python):
# Linux
sudo apt-get install python3-venv # En caso necesario de no contar con python3-venv
python3 -m venv venv
# macOS
python3 -m venv venv
# Windows
python -m venv venv
Y aquí viene la magia de VS Code, vamos a abrir una línea de comandos desde la opción Terminal > New Terminal, esto abre una consola integrada en nuestro editor y automáticamente activa el entorno virtual ejecutando el script de activación.
Del lado izquierdo visualizarás la barra de estado de VS Code indicando que estamos utilizando un entorno virtual.
random
para generar números aleatorios, pero que pasa con Django.pip install --upgrade pip
pip install django
pip freeze
django-admin
que nos permitirá crear nuestro primer proyecto.django-admin startproject proyecto_django .
.
) al final del comando indica que el proyecto será creado en la carpeta actual.proyecto_django/settings.py
), pero ahora queremos manejar múltiples archivos de configuración por cada entorno manejado.settings
, creamos la carpeta dentro de la subcarpeta proyecto_django
y creamos la siguiente estructura de archivos:proyecto_django/settings
├── __init__.py
├── base.py
├── local.py
└── production.py
settings
:__init__.py
: Un archivo vacío que le dice a Python que esta carpeta se trata de un paquete.base.py
: Todas las configuraciones en común entre entornos.local.py
: Contiene todas las configuraciones de tu entorno local (que incluyen las de base.py
).production.py
: Configuraciones para el entorno de producción.base.py
. Como recomendación copia el contenido del archivo settings.py
y pegalo en base.py
luego ve identificando que configuraciones son distintas entre tus diferentes entornos.# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
DEBUG
activado te facilitará visualizar una página detallada de errores a la hora de codear. En un entorno de producción no queremos mostrarle a nuestros usuarios esos errores detallados, ya que contiene datos sensibles del servidor, por lo que estaríamos expuestos a detalles de seguridad.ALLOWED_HOSTS
es una lista de hosts/nombres de dominio que nuestro sitio de Django puede servir. Si la variable DEBUG
es True
y ALLOWED_HOSTS
es una lista vacía se proporcionará acceso solamente a ['.localhost', '127.0.0.1', '[::1]']
.local.py
y production.py
, por ahora solamente cambiamos en el archivo production.py
la variable DEBUG
en False
. Ya podemos eliminar esas dos variables de configuración en el archivo base.py
.local.py
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
production.py
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = []
DATABASES
que contiene las configuraciones para todas las bases de datos usadas con Django:# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
DATABASES
y pegalo en tu archivo local.py
, para el caso de production.py
puedes utilizar por ahora el ejemplo para PostgreSQL. Ya puedes eliminar la configuración para la variable DATABASES
en el archivo base.py
.STATIC_URL
que es la URL a usar para hacer referencia a los archivos estáticos, puede tener diferentes valores dependiendo del entorno, pero por ahora usaremos el mismo valor para los archivos local.py
y production.py
.base.py
a local.py
y production.py
:from .base import *
base.py
"""
Django settings for proyecto_django project.
Generated by 'django-admin startproject' using Django 3.2.6.
For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'my-secret-key'
# Application definition
INSTALLED_APPS = [
'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 = 'proyecto_django.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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 = 'proyecto_django.wsgi.application'
# Password validation
# https://docs.djangoproject.com/en/3.2/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/3.2/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
local.py
from .base import *
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/
STATIC_URL = '/static/'
production.py
from .base import *
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = []
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/
STATIC_URL = '/static/'
base.py
te encontrarás con la variable de configuración INSTALLED_APPS
que es una lista de todas las aplicaciones que están habilitadas para el proyecto. Django maneja el concepto de aplicación como un conjunto de funcionalidades únicas y que se pueden reutilizar en otros proyectos.DJANGO_APPS
, para los paquetes de terceros la variable THIRD_PARTY_APPS
y para paquetes propios la variable LOCAL_APPS
, las variables se verán de la siguiente manera:# Application definition
DJANGO_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
THIRD_PARTY_APPS = []
LOCAL_APPS = []
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS
settings.py
que trae Django por defecto a múltiples archivos de configuración por cada entorno, tenemos que actualizar los archivos asgi.py
, wsgi.py
y manage.py
.os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proyecto_django.settings')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proyecto_django.settings.local')
local.py
.Para un entorno de producción tienes que configurar la variable de entorno DJANGO_SETTINGS_MODULE
para apuntar hacia el archivo de configuración proyecto_django.settings.production
python manage.py migrate
proyecto_django
un archivo db.sqlite3
en donde se guardarán los datos para el entorno local.SECRET_KEY
que no debemos usar la misma para producción y para desarrollo, DATABASES
si estas manejando de manera local una base de datos PostgreSQL, en donde tendrás que especificar nombre de usuario, contraseña del usuario, nombre de la base de datos, puerto, etc..env
, ejecuta el siguiente comando en tu consola:pip install python-decouple
.env
en la raíz de tu proyecto con el siguiente contenido:SECRET_KEY=my-secret-key
DB_NAME=django
DB_USER=root
DB_PASSWORD=
DB_HOST=127.0.0.1
DB_PORT=5432
El archivo .env
no se agregará al historial de cambios en el sistema control de versiones, ya que en un paso anterior lo hemos agregado en el .gitignore
base.py
:from decouple import config
SECRET_KEY
por lo siguiente:SECRET_KEY = config('SECRET_KEY')
local.py
:DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': config('DB_NAME'),
'USER': config('DB_USER'),
'PASSWORD': config('DB_PASSWORD'),
'HOST': config('DB_HOST'),
'PORT': config('DB_PORT'),
}
}
.env
..env
son manejados como una cadena de texto, pero en caso de que quieras configurar una variable como EMAIL_PORT
, manejada por Django para el envió de correos, esta debe ser configurada como un entero, por lo que podemos pasarle el argumento cast
a la función config()
para transformar el valor de cadena como un número entero:config('EMAIL_PORT', cast=int)
config()
es default
, que definirá un valor por defecto en caso de que la variable de entorno no este definida en el archivo .env
:config('EMAIL_PORT', default=25, cast=int)
EMAIL_PORT
este definida en el archivo .env
.env.example
en la raíz del proyecto que contendrá datos de ejemplo, esto servirá como referencia para crear el archivo .env
con los valores del entorno apropiado.El archivo .env.example
si se agregará al repositorio, ya que solo contendrá datos de ejemplo con las variables de entorno para crear el archivo .env
, y recuerda cambiar los valores para que tu entorno funcione correctamente.
python manage.py startapp home
apps
, aquí englobaremos todas las apps creadas.home
de la raíz del proyecto.apps
y ejecuta el siguiente comando:cd apps
django-admin startapp home
apps
se ha creado una subcarpeta home
con la siguiente estructura:apps
└── home
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
views.py
: Contiene la lógica o funcionalidad de la aplicación.models.py
: Contiene un conjunto de clases que definen la estructura de datos a utilizar por la aplicación.migrations
: Una carpeta que es usada por Django para manejar las versiones de la base de datos.apps.py
: Configuraciones propias de la aplicaciónadmin.py
: Creación de la interfaz administrativa para el manejo de modelos.tests.py
: Creación de pruebas.home/views.py
para crear una vista que nos retorne un saludo como respuesta:from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, Django!")
home/urls.py
para definir las diferentes rutas asociadas a las vistas:from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="home"),
]
proyecto_django
hay un archivo urls.py
que es el encargado de manejar el enrutamiento dentro de la aplicación. Una buena práctica es crear un archivo urls.py
dentro de cada app, con la idea de modularizar las rutas de cada aplicación.proyecto_django/urls.py
tienen que incluirse las rutas de cada app:from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("", include("apps.home.urls")),
path('admin/', admin.site.urls)
]
python manage.py runserver
http://127.0.0.1:8000
para ver una página que renderiza "Hello, Django!".launch.json
que contendrá las configuraciones de depuración.launch.json
con las configuraciones para ejecutar la aplicación de Django. {
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Django",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/manage.py",
"args": [
"runserver"
],
"django": true
}
]
}
"${workspaceFolder}/manage.py"
con los argumentos en la lista args
.http://127.0.0.1:8000
y verifica que la aplicación se ejecuta correctamente. De ahora en adelante puedes usar Run > Start Debugging en cualquier momento para probar la aplicación.