0%

django的创建与配置

Django 纯净版的创建:

使用Django admin路径:

python3 manage.py createsuperuser   # 创建admin账户密码

安装Django环境:

# 安装virtualenv
pip3 install virtualenv

# 创建python环境文件夹
python3 -m venv django_venv # (bash 运行结果,会在当前文件夹创建一个django_venv的文件夹)

# source /bin/activate
source ./django_venv/bin/activate
# 备注:如果进入虚拟环境成功,在命令行前面会有一个小括号

# 进入成功后,安装django环境
pip3 install django #国外服务器下载
pip3 install django==2.2 # 指定安装django版本2.2
pip3 install django -i https://pypi.douban.com/simple # 国内豆瓣源加速连接

# 创建网站项目工程
# django-admin startproject <网站工程名>
django-admin startproject mysite

# 开启python—django网站服务
python3 manage.py runserver # 以默认的方式启动django服务
python3 manage.py runserver 0.0.0.0:8000 # 命令行模式

nohup python3 manage.py runserver 0.0.0.0:8000 > manage.log 2>&1 & # 进程模式

# python manage.py startapp <子应用名称>
python manage.py startapp index # 创建了一个名叫 的文件夹

settings:配置

  • 如果使用默认的sqlite数据库:
# 在虚拟环境下使用:
python3 manage.py makemigrations
python3 manage.py migrate
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = 'django-insecure-p5t$3q2@12loakok_!**=^+c2h+fpgw#ca=zl$@in)(^=tcv^f'
DEBUG = True
ALLOWED_HOSTS = []
INSTALLED_APPS = [
# 'django.contrib.admin', # 纯净版django # django 内置后台管理,简单数据库的增删改查
# 'django.contrib.auth', # 纯净版django 剔除 # 用户登录和认证权限
# 'django.contrib.contenttypes', # 纯净版django 剔除 # 复杂表结构关系
# 'django.contrib.sessions', # 纯净版django 剔除 # 如果项目中有登录成功 让用户可以访问
# 'django.contrib.messages', # 纯净版django 剔除 # 消息展示,依赖Session
'django.contrib.staticfiles', # 静态资源处理,图片、css、js等
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
# 'django.contrib.sessions.middleware.SessionMiddleware', # 纯净版django 剔除
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
# 'django.contrib.auth.middleware.AuthenticationMiddleware', # 纯净版django 剔除
# 'django.contrib.messages.middleware.MessageMiddleware', # 纯净版django 剔除
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'Dome_Datou.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 剔除
# 'django.contrib.messages.context_processors.messages', # 纯净版django 剔除
],
},
},
]
WSGI_APPLICATION = 'Dome_Datou.wsgi.application'
# >>> python3 manage.py makemigrations
# >>> python3 manage.py migrate
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
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',
},
]

# LANGUAGE_CODE = 'en-us' # 设置 英文
LANGUAGE_CODE = 'zh-hans' # 设置中文
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai' # 亚洲上海
# 启用国际化
USE_I18N = True
# 启用本地化
# USE_L10N = True
USE_TZ = True
STATIC_URL = 'static/'
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

urls:配置

from django.contrib import admin
from django.urls import path

urlpatterns = [
# path('admin/', admin.site.urls),
]

Django 多App的创建:

  • 1、在根目录下创建目录:apps

    # 创建apps
    # 以下命令 在项目根目录下运行 就是在有 manage.py文件的那个路径
    mkdir apps # 创建apps文件夹

    # 创建即将创建的 app名称文件夹
    mkdir apps/app01

    # 创建app01
    python3 manage.py startapp app01 apps/app01 # 在apps/app01 中创建app01程序


    # 创建即将创建的 app名称文件夹
    mkdir apps/www

    # 创建app01
    python3 manage.py startapp www apps/www # 在apps/www 中创建www程序
  • 修改app下面 apps.py中的配置文件

修改apps中的配置

  • 在settings中组册app

    INSTALLED_APPS = [
    # 'django.contrib.admin', # 纯净版django # django 内置后台管理,简单数据库的增删改查
    # 'django.contrib.auth', # 纯净版django 剔除 # 用户登录和认证权限
    # 'django.contrib.contenttypes', # 纯净版django 剔除 # 复杂表结构关系
    # 'django.contrib.sessions', # 纯净版django 剔除 # 如果项目中有登录成功 让用户可以访问
    # 'django.contrib.messages', # 纯净版django 剔除 # 消息展示,依赖Session
    'django.contrib.staticfiles', # 静态资源处理,图片、css、js等
    'apps.app01.apps.App01Config'
    ]

    image-20240514014804221

路由:配置

  • 路由分发配置:

    • 访问url:http://127.0.0.1:8000/web/user/

    • 主路由:

      from django.urls import path, re_path, include
      urlpatterns = [
      path("web/", include("apps.www.urls"))
      ]
    • 子路由(apps/www):

      from django.urls import path
      from apps.www import views

      urlpatterns = [
      path("user/", views.user)
      ]
    • 视图配置:

      from django.http import HttpResponse
      # Create your views here.
      def user(request):
      return HttpResponse("创建用户名成功 >>> ")
  • 路由中 name的使用 => 反向生成网址,登录成功 => 跳转页面:

    from apps.app01 import views
    # 自定义请求 添加模块
    from django.urls import URLPattern, ResolverMatch
    from django.urls.resolvers import RoutePattern, RegexPattern # RoutePattern:普通路由, 正则路由: RegexPattern


    class MyURLPattern(URLPattern):
    def resolve(self, path):
    match = self.pattern.match(path)
    if match:
    new_path, args, captured_kwargs = match
    # Pass any default args as **kwargs.
    kwargs = {**captured_kwargs, **self.default_args}
    return ResolverMatch(
    self.callback,
    args,
    kwargs,
    self.pattern.name,
    route=str(self.pattern),
    captured_kwargs=captured_kwargs,
    extra_kwargs=self.default_args,
    )


    class MyRoutePattern(RoutePattern):
    def match(self, path):
    match = self.regex.search(path)
    if match:
    # RoutePattern doesn't allow non-named groups so args are ignored.
    kwargs = match.groupdict()
    for key, value in kwargs.items():
    converter = self.converters[key]
    try:
    kwargs[key] = converter.to_python(value)
    except ValueError:
    return None
    return path[match.end():], (), kwargs
    return None
    urlpatterns = [
    MyURLPattern(MyRoutePattern("login/<str:v1>", name="n1", is_endpoint=True), views.login, None, "n1"), # 等价于 path('login/', views.login, name="n1"),
    ]
    def login(request, v1):
    url = reverse('n1', kwargs={"v1": v1}) # kwargs={"<路由中的键>": <用户传递进来的v1>}
    print(url) # /login/sdad
    return HttpResponse("欢迎登录!")
  • urls.py 配置:

    from django.contrib import admin
    from django.urls import path, re_path
    from apps.app01 import views

    # 自定义请求 添加模块
    from django.urls import URLPattern, ResolverMatch
    from django.urls.resolvers import RoutePattern, RegexPattern # RoutePattern:普通路由, 正则路由: RegexPattern

    # 重写 URLPattern
    class MyURLPattern(URLPattern):
    def resolve(self, path):
    match = self.pattern.match(path)
    if match:
    new_path, args, captured_kwargs = match
    # Pass any default args as **kwargs.
    kwargs = {**captured_kwargs, **self.default_args}
    return ResolverMatch(
    self.callback,
    args,
    kwargs,
    self.pattern.name,
    route=str(self.pattern),
    captured_kwargs=captured_kwargs,
    extra_kwargs=self.default_args,
    )

    # 重写 RoutePattern
    class MyRoutePattern(RoutePattern):
    def match(self, path):
    match = self.regex.search(path)
    if match:
    # RoutePattern doesn't allow non-named groups so args are ignored.
    kwargs = match.groupdict()
    for key, value in kwargs.items():
    converter = self.converters[key]
    try:
    kwargs[key] = converter.to_python(value)
    except ValueError:
    return None
    return path[match.end():], (), kwargs
    return None

    urlpatterns = [
    # 默认后台登录页面, 一般不用(自己重写)
    # path('admin/', admin.site.urls),

    # http://127.0.0.1:8000/login/ # 默认地址 无传参
    # http://127.0.0.1:8000/login/?a1=1&a2=2 # 默认传递两个参数 : a1=1 a2=2
    MyURLPattern(MyRoutePattern("login/", name=None, is_endpoint=True), views.login, None, None),
    # path('login/', views.login),

    # http://127.0.0.1:8000/info/2222/
    # http://127.0.0.1:8000/info/2222/?a1=1&a2=2
    # path("info/<int:v1>/", views.info),
    MyURLPattern(MyRoutePattern("info/<int:v1>/", name=None, is_endpoint=True), views.info, None, None),

    # http://127.0.0.1:8000/info/2222/
    # http://127.0.0.1:8000/info/2222/?a1=1&a2=2
    # path("xx/<path:v2>/", views.s_path),
    MyURLPattern(MyRoutePattern("xx/<path:v2>/", name=None, is_endpoint=True), views.s_path, None, None),

    # # http://127.0.0.1:8000/xx/f9aa6e73-c310-8aab-a36c-e9758d8c4a1d/
    # path("xx/<uuid:v3>/", views.uuid),
    MyURLPattern(MyRoutePattern("xx/<uuid:v3>/", name=None, is_endpoint=True), views.uuid, None, None),

    # # http://127.0.0.1:8000/other/11/kanoc/
    # path("other/<int:v1>/<str:v2>/", views.other),
    MyURLPattern(MyRoutePattern("other/<int:v1>/<str:v2>/", name=None, is_endpoint=True), views.other, None, None),

    # 要使用 re_path 要引入文件 from django.urls import path, re_path
    # # http://127.0.0.1:8000/yy/2024-05-14/
    # re_path(r'yy/(\d{4})-(\d{2})-(\d{2})', views.yy),
    MyURLPattern(RegexPattern(r'yy/(\d{4})-(\d{2})-(\d{2})', name=None, is_endpoint=True), views.yy, None, None),
  • views.py 配置:

from django.shortcuts import render
from django.http import HttpResponse


# Create your views here.

# path('login/', views.login),
def login(request):
print(request.GET)
# # 如果 http://127.0.0.1:8000/login/?a1=1&a2=2
# # 则:
# a1 = request.GET.get('a1') # 获取 a1的值
# a2 = request.GET.get('a2') # 获取 a2的值
# print(a1)
# print(a2)
return HttpResponse("欢迎登录!")

# path("info/<int:v1>/", views.info)
# http://127.0.0.1:8000/info/2222/
def info(request, v1):
print(v1) # 结果 :2222
print(request.GET)
return HttpResponse("欢迎登录!")

# path("xx/<path:v2>/", views.s_path),
# http://127.0.0.1:8000/xx/user/ps/ja/
def s_path(request, v2):
print(v2) # 结果 :user/ps/ja
print(request.GET)
return HttpResponse("欢迎登录!")

# path("xx/<uuid:v3>/", views.uuid)
# http://127.0.0.1:8000/xx/f9aa6e73-c310-8aab-a36c-e9758d8c4a1d/
def uuid(request, v3):
print(v3) # 结果 :f9aa6e73-c310-8aab-a36c-e9758d8c4a1d
print(request.GET)
return HttpResponse("欢迎登录!")

# path("other/<int:v1>/<str:v2>/", views.uuid),
# http://127.0.0.1:8000/other/11/kanoc/
def other(request, v1, v2):
print(v1, v2) # 结果 :11 kanoc
print(request.GET)
return HttpResponse("欢迎登录!")

# 此路由 为正则匹配路由, 要使用则正匹配路由 需要在路由配置文件中 引入模块 from django.urls import path, re_path
# re_path(r'yy/(\d{4})-(\d{2})-(\d{2})', views.other)
# http://127.0.0.1:8000/yy/2024-05-14/

def yy(request, v1, v2, v3):
print(v1, v2, v3) # 结果 :2024 05 14
print(request.GET)
return HttpResponse("欢迎登录!")

 URL-CBV:写法

  • cbv写法 django会自动定位到 请求到方法,不用自己单独的去判断postget

image-20240514215331327

from django.urls import path
from apps.CBV import views

urlpatterns = [
path("cbv/", views.CBV.as_view())
]
from django.shortcuts import render
from django.http import HttpResponse
from django.views import View

# Create your views here.

class CBV(View):
def get(self, request):
return HttpResponse("The CBV get")

def post(self, request):
return HttpResponse("The CBV post")

URL-CBV:取值

from django.urls import path, re_path
from apps.CBV import views

urlpatterns = [
path("cbv/<int:v1>", views.CBV.as_view()), # 传递的 v1 会放到 self.kwargs
re_path("cbv/(\d+)/", views.CBV.as_view()), # 传递的 参数 会放到 self.args
re_path("cbv/(?P<v1>\d+)/", views.CBV.as_view()) # 传递的 参数 会放到 self.kwargs
]
from django.shortcuts import render
from django.http import HttpResponse
from django.views import View
class CBV(View):
def get(self, request, v1):
# 非命名的方式 传递的参数,会放到 self.args 命名的参数,会放到self.kwargs
print(self.request, self.args, self.kwargs)
return HttpResponse("The CBV get")
def post(self, request):
return HttpResponse("The CBV post")

ORM:配置

  • 新建app:
python3 manage.py startapp app01 # 在当前目录下 创建一个叫 app01的文件夹
  • settings 中组册app目录:

INSTALLED_APPS = [
# 'django.contrib.admin', # 纯净版django # django 内置后台管理,简单数据库的增删改查
# 'django.contrib.auth', # 纯净版django 剔除 # 用户登录和认证权限
# 'django.contrib.contenttypes', # 纯净版django 剔除 # 复杂表结构关系
# 'django.contrib.sessions', # 纯净版django 剔除 # 如果项目中有登录成功 让用户可以访问
# 'django.contrib.messages', # 纯净版django 剔除 # 消息展示,依赖Session
'django.contrib.staticfiles', # 静态资源处理,图片、css、js等
'app01.apps.App01Config' # 添加app
]
  • models.py 配置:
from django.db import models
# Create your models here.
class UserInfo(models.Model):
username = models.CharField(verbose_name="用户名", max_length=32)
password = models.CharField(verbose_name="密码", max_length=64)

  • 读取models 生成相应本地配置:
1、>>> python3 manage.py makemigrations   # 生成配置  
2、>>> python3 manage.py migrate # 载入配置

返回数据:

from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect

return HttpResponse("The CBV get") # 返回字符串
return JsonResponse({"status": True, "name": "小蘑菇"}, json_dumps_params={"ensure_ascii": False}) # 返回中文 而非 ascii 码
return render(request, "demo.html") # 返回html 页面
return redirect("https://www.baidu.com", permanent=False) # 返回 302 临时重定向
return redirect("https://www.baidu.com", permanent=True) # 返回 301 永久重定向