From dcf30efb337ddec4bb49789586d0720c5573c84f Mon Sep 17 00:00:00 2001 From: Celestino Rey Date: Thu, 15 Aug 2024 15:15:21 +0200 Subject: [PATCH] Ejemplo Docker Django --- EjemploPy/Dockerfile | 24 +++++ EjemploPy/db.sqlite3 | Bin 0 -> 131072 bytes EjemploPy/hello/__init__.py | 0 EjemploPy/hello/admin.py | 3 + EjemploPy/hello/apps.py | 6 ++ EjemploPy/hello/migrations/__init__.py | 0 EjemploPy/hello/models.py | 3 + EjemploPy/hello/static/hello/styles.css | 38 ++++++++ EjemploPy/hello/templates/home.html | 21 ++++ EjemploPy/hello/tests.py | 3 + EjemploPy/hello/urls.py | 6 ++ EjemploPy/hello/views.py | 4 + EjemploPy/manage.py | 22 +++++ EjemploPy/mysite/__init__.py | 0 EjemploPy/mysite/asgi.py | 16 +++ EjemploPy/mysite/settings.py | 124 ++++++++++++++++++++++++ EjemploPy/mysite/urls.py | 24 +++++ EjemploPy/mysite/wsgi.py | 16 +++ EjemploPy/requirements.txt | 4 + 19 files changed, 314 insertions(+) create mode 100644 EjemploPy/Dockerfile create mode 100644 EjemploPy/db.sqlite3 create mode 100644 EjemploPy/hello/__init__.py create mode 100644 EjemploPy/hello/admin.py create mode 100644 EjemploPy/hello/apps.py create mode 100644 EjemploPy/hello/migrations/__init__.py create mode 100644 EjemploPy/hello/models.py create mode 100644 EjemploPy/hello/static/hello/styles.css create mode 100644 EjemploPy/hello/templates/home.html create mode 100644 EjemploPy/hello/tests.py create mode 100644 EjemploPy/hello/urls.py create mode 100644 EjemploPy/hello/views.py create mode 100755 EjemploPy/manage.py create mode 100644 EjemploPy/mysite/__init__.py create mode 100644 EjemploPy/mysite/asgi.py create mode 100644 EjemploPy/mysite/settings.py create mode 100644 EjemploPy/mysite/urls.py create mode 100644 EjemploPy/mysite/wsgi.py create mode 100644 EjemploPy/requirements.txt diff --git a/EjemploPy/Dockerfile b/EjemploPy/Dockerfile new file mode 100644 index 0000000..119e216 --- /dev/null +++ b/EjemploPy/Dockerfile @@ -0,0 +1,24 @@ +# Utilizar una imagen base de Python +FROM python:3.11-slim + +# Establecer el directorio de trabajo en el contenedor +WORKDIR /app + +# Copiar el archivo requirements.txt al directorio de trabajo +COPY requirements.txt . + +# Instalar las dependencias +RUN pip install --no-cache-dir -r requirements.txt + +# Copiar el resto del código de la aplicación +COPY . . + +# Exponer el puerto en el que correrá la aplicación +EXPOSE 8000 + +# Ejecutar las migraciones y colectar archivos estáticos +RUN python manage.py migrate +#RUN python manage.py collectstatic --noinput + +# Comando para iniciar el servidor de Django +CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] diff --git a/EjemploPy/db.sqlite3 b/EjemploPy/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..177dea92d77b0c734d0f5840c00f161881d2d1a1 GIT binary patch literal 131072 zcmeI5TWlNIdB-{8kQ617M^{sgEsLU8yJlrc9Ny_|+SPg$TUoEX>q|EV8cc`eNT$P! zOj5oeKv61oQf%5jG)RCHXtyr`5~L4J+9D50fFeOrv_+e?NCG5jiuP&S0!fM%Z64YH z{m$VGXE>xNtrG*b@aJMjJafMD&Hwz)WoEuJV_tjXa=E2Pw(E_m)`}!u6D~<|y%dSK zT&~mfKmTif&eIp!OweD+_Whu*r(LUWzTd-*+5d8zaOclK=GYGcAOHd&00JNY0w4ea zAOHd&00JQJvnMb+9VDkyyAN=t93drjJGmmAHNTGOh!TGj5W z6}`68x;4mCHj~U}^Dj-1r;Da1McvyiX)RsdZPf2SP@@0oyGN0c%I9*~^u-W4xnVeo=j|1$Xh*A0GLeg?bMFh1qid$4oZS(}a|A9* zKCL7YuLj7^2Tea&!_QrJ7C@O{eYX%|VFbsa!gjTOTK9o2Ijj z+R*Rpl^eQRtk+t4t<`$4t2b3@`9!}9Wi_9R$MdO|$H>L2ri-+_UII|1zEiHLwY|!K zUPC^VTsoC_$xlAawvMOlKDun`yR88gQC4$GI-XBn7$py8TgQ`j4|-KASB7>uWi^w_ zR$n{3*C?xLB~G39lGo!}y0~t~$SD%vYW;2(ugdufr-Se&)44=O z+4Oi^VbWBpmTTl9sS;0WnZ^Ur&RVfWV^iI(Xgg~0R=r#t)Y!_Zl1VDr{JKo8h_c}- zVYxD7(WtF+xBY73tN9F#?nK;8E|$73hD-?Y)m$c-$RyWBh$)p26T+|=B)*!?Wfdix zl?dIE6W!1wDVc0sNd?(wU0!zA#r}lCcecZ)<$o`srmwlD}0VVJO z0T2KI5C8!X009sH0T2KI5C8!Xcv1vrJzTKEnv1rZo}w2#q=gq`p`73LbtUsegkIjDn#+b%GvClC zEa=S)ZeeIMEeugS`5t=ZLYiNaxfnB>tKi>H(`yvcV$3a$E^afshZm_Ry%|BR?KY0z zwJ-#9Z0OYoZeu9u+87c<`V_s|K(%yp4P65+LL|=8YYWnHazv=G?rytMtX=1PWVx0d zG4xm&+}03f?L0^CA8>0!nU%q<4SCki=jj~->a`_1Qoys1V8`; zKmY_l00ck)1V8`;K;SqLn3AO>sV8_dHzP|i$q}mwcXk^0q(;o;#H1{pk?c{J*%Pv~ zBK1XGX69r`kp{$9raKviTU%sgYF3t(C1<>3lF8D7WQ9g1gaCUmgmv~94tYc)6q2QR zsT=GFPRP=tWQ%VE1c9D_#&~C!;Y36v#>A1WaD`v!a|S3z!?Ls{^#>z-o&APGD{|l! zR2=~Z&y?(cLF$Pn$TPBkS#pF9++wHU)4cs3nUMWU^ZKmY_l00ck)1V8`;KmY_l00fRd0sj2|9NTlT|6@O9|H*#9-eLd3zQ?}BzQO*I zeVu)keTjX6eV%=Wz0E$&KEZyAeT=o)hp7NQAOHd&00JNY0w4eaAOHd&00JNY0>cS- z+>+#-6Wg%Zo)FtvzV*zA?X=iViR~oc$`fMC#5N?hLB4ed#CBY4$Hdmpwl0hA z*m`8QUy}L8%{L=%x8INT|KUxATo3>O5C8!X009sH0T2KI5C8!XI1U8x@BbZ#Rzw{@ z00ck)1V8`;KmY_l00ck)1VCUo0o?x&=Yw1j009sH0T2KI5C8!X009sH0T4J21aSX< z99j`|009sH0T2KI5C8!X009sH0T2Lz;RJC1Kb#M8K>!3m00ck)1V8`;KmY_l00cnb zI1s@7|8ZzV)ByxQ00ck)1V8`;KmY_l00ck)1cnm``u^KBCV$e!o(uhh|6AU#1@8sk z^3HhPls`HCWAnd}pNw3Qe#iB9uJ<~8jsMX5$gvAa5C8!X_^AlAe`(4W{?LllZkB5$ z{l2!>x~1+l^@h6BsPFAIJKxKtPEw^W`BX9;FUE`NUafq`X+C}7>c;x@jmV9y%{Ojr zL^iix+4w*t>a;quyZk<*13cQq_Z8t)=+QyqmnVGT50d!ThKcWZ zBHaZg5ib_D^MiFy9!Ynfv%@5t1){P2__!~;vLZd4ZfS)|hn}soINLd3=()cB^5u=e zElLd-Dc4&1j^2oDUAZ3Fx^ek(!?8&@~BE^J)09f~98oh0%K&%G*yY;J8{-(0_Z`KGaR;}v^~D?w!uh=PFl!Bo&VaE-dUNn_^$!>xeMOCK*550K4U+DN?Jw3hO5R0h zreR`LiqE}AaBmej;((#n{`;r8#ow*C_QbR=e1*=iiZ#XCCe7~2Frz66y_73BXVIAf zv-+^|w&~nv#_5}LXRLjjjfUIqytIGD($v@WtaHBAi2URkFP4&tbRlkC0rVA}FfT|%W*4as2vagTE_CFBth1b`mhc8+qRFDuGt7@H5Ixr_VV5AN-e5}zb zJRNN`anqxXqdpE#VywPC;tek^OE(4B=ABBprK?T-&YoT?>W-wl2caYLY)z}`=cr_? zeN*y<*Vd$cP53O`)@nO-wOZb3Xf1vn*SBM&$8WSR|FK#`+ue;u?rM$VEv<1jkxs|D z*CvFOYdtuZidM=xO^qe3rMJpey<0Sf_5XJ}b;2G5KmY_l00ck)1V8`;KmY_l00f>r z0zvmh*R<=uTg>=*o>8~y(1l=t81Ie_ZOAG>e5|7_&frME^dkl9o8 zabJ|a@>p`(Gm0;KEhe?|BF<<;XPUZLlvDNlyXA(i@<@rQrHh$FCX?(ni5SrxV8 z7KM*Yd#be-jkNUpt!{*fa_uq)gpgj0d&5^^l1tDuf@l;ku8XwVt6Wuj)8opjH@vZM zP+=?VtaQJQwkMZ;;l)L%UA1DTBGf8O#5dLp$jW%E$Xjo4O-b81c7n+<_iwwVdOKtC zoHu-NacIRl@!?L*#P=Y<(fU(NDHWxS8l4!J&J924qvF(EB0Q-_a08# zJj4)7-eap;xnhY-q*Fa2xsaB&y&a7>MNp1bY?bd)Fx8nQW`x_+s|N;B>7d)?2GxCt zuvq)KC@rin_bjYiv3|8!r$y&lOKm;a)%lu6Vmp=1=&8=)i)9xwTGaj|fR%fo7u#xu zWzENf?Wae(5S7*w)QVQnD{7V6zM^I`g;KJVEQp35 zpj;l<_yY`wd+s@n+68ekT}^zoO~|5-ym{IeP9~-Oy#17FFF8QNd~eeauz0NIxAYy@ zDjn5>vt#XvdHag3AxkS&%QZgVc2{hR=}by5Xc?!$DWh7wS1kvZ?}6Pl<5lMqHD73t zwa=dNg;iQae#72Vy0-nJIaMg?IlbVNcJdHu_6FngV$tw(utZ0RXzU}uc2Ybf^szO2 zPv}Z@Dmp!|4|L5Rs{_;vxAkI+gEKC$IwwVAcSGN$MO5>wnsAI)eom^_)a{D46OA;h zTBSnICq?#Z&GHVNj=E>j$c0NA7hdIq!EXPH?~TM`d@8&}>z2A&r3+nchfZ+L%RDDE zYl7m>KmDvGC$slh-pwbh>__Ncz8I(vpY)6>^VLoJm51Rx)_#AOX0>&xeaAYd2`OS@ zP3_Ky@|5jDA-$a_b_I0?nytWldVBA|hK`5xOwYEn*+4;@fOWXez{{QRg^N^~n}=1# zpsi~8w62vD+jAVwdjH&!tKsx{lnNMSXwJAdOHX zx3fBPMs)^UZw$2W&Ywe$_HHUlU6MC00ck)1V8`;KmY_l00ck)1V8`;4kLj3|HB9&9|S-E1V8`;KmY_l00ck) z1V8`;o_zvAs)Cojc9#E40RKsYpqo-*o)Z7M|I`R27kSe9 z9fCvC|)=R0T2KI5C8!X009sH0T2KI L5CDOvg24X+=|=Xq literal 0 HcmV?d00001 diff --git a/EjemploPy/hello/__init__.py b/EjemploPy/hello/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/EjemploPy/hello/admin.py b/EjemploPy/hello/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/EjemploPy/hello/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/EjemploPy/hello/apps.py b/EjemploPy/hello/apps.py new file mode 100644 index 0000000..bfc55f0 --- /dev/null +++ b/EjemploPy/hello/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class HelloConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'hello' diff --git a/EjemploPy/hello/migrations/__init__.py b/EjemploPy/hello/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/EjemploPy/hello/models.py b/EjemploPy/hello/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/EjemploPy/hello/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/EjemploPy/hello/static/hello/styles.css b/EjemploPy/hello/static/hello/styles.css new file mode 100644 index 0000000..cca44ef --- /dev/null +++ b/EjemploPy/hello/static/hello/styles.css @@ -0,0 +1,38 @@ +/* hello/static/hello/styles.css */ +body { + font-family: Arial, sans-serif; + background-color: #f0f0f0; + margin: 0; + padding: 0; +} + +header { + background-color: #afafaf; + color: white; + padding: 1em; + text-align: center; +} + +nav ul { + list-style-type: none; + padding: 0; +} + +nav li { + display: inline; + margin-right: 10px; +} + +nav a { + color: white; + text-decoration: none; +} + +h1 { + text-align: center; +} + +p { + text-align: center; + font-size: 1.2em; +} diff --git a/EjemploPy/hello/templates/home.html b/EjemploPy/hello/templates/home.html new file mode 100644 index 0000000..e183b83 --- /dev/null +++ b/EjemploPy/hello/templates/home.html @@ -0,0 +1,21 @@ +{% load static %} + + + + + Biblioteca + + + +
+ +
+

¡Hola, mundo!

+

Bienvenido a mi primera aplicación Django con plantillas.

+ + diff --git a/EjemploPy/hello/tests.py b/EjemploPy/hello/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/EjemploPy/hello/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/EjemploPy/hello/urls.py b/EjemploPy/hello/urls.py new file mode 100644 index 0000000..9ec8361 --- /dev/null +++ b/EjemploPy/hello/urls.py @@ -0,0 +1,6 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path('', views.home, name='home'), +] diff --git a/EjemploPy/hello/views.py b/EjemploPy/hello/views.py new file mode 100644 index 0000000..cf6e5a8 --- /dev/null +++ b/EjemploPy/hello/views.py @@ -0,0 +1,4 @@ +from django.shortcuts import render + +def home(request): + return render(request, 'home.html') diff --git a/EjemploPy/manage.py b/EjemploPy/manage.py new file mode 100755 index 0000000..a7da667 --- /dev/null +++ b/EjemploPy/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/EjemploPy/mysite/__init__.py b/EjemploPy/mysite/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/EjemploPy/mysite/asgi.py b/EjemploPy/mysite/asgi.py new file mode 100644 index 0000000..44c7dff --- /dev/null +++ b/EjemploPy/mysite/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for mysite project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.1/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings') + +application = get_asgi_application() diff --git a/EjemploPy/mysite/settings.py b/EjemploPy/mysite/settings.py new file mode 100644 index 0000000..d028e19 --- /dev/null +++ b/EjemploPy/mysite/settings.py @@ -0,0 +1,124 @@ +""" +Django settings for mysite project. + +Generated by 'django-admin startproject' using Django 5.1. + +For more information on this file, see +https://docs.djangoproject.com/en/5.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/5.1/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/5.1/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-=+0f!+$+jw$f1n_qjm&p3_w)t13*66sv_+sq%&&ee_n^s+caq=' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'hello', +] + +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': [], + '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/5.1/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/5.1/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/5.1/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/5.1/howto/static-files/ + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/5.1/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/EjemploPy/mysite/urls.py b/EjemploPy/mysite/urls.py new file mode 100644 index 0000000..bf68d6d --- /dev/null +++ b/EjemploPy/mysite/urls.py @@ -0,0 +1,24 @@ +""" +URL configuration for mysite project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/5.1/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path, include + +urlpatterns = [ + path('admin/', admin.site.urls), + path('', include('hello.urls')), # Incluyendo las URLs de la aplicación + +] diff --git a/EjemploPy/mysite/wsgi.py b/EjemploPy/mysite/wsgi.py new file mode 100644 index 0000000..61b0d9d --- /dev/null +++ b/EjemploPy/mysite/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for mysite project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings') + +application = get_wsgi_application() diff --git a/EjemploPy/requirements.txt b/EjemploPy/requirements.txt new file mode 100644 index 0000000..4c99c68 --- /dev/null +++ b/EjemploPy/requirements.txt @@ -0,0 +1,4 @@ +asgiref==3.8.1 +Django==5.1 +sqlparse==0.5.1 +typing_extensions==4.12.2