Django | 一文带你搞定Django项目的创建、应用的注册、服务请求、urls.py的 ...

打印 上一主题 下一主题

主题 1013|帖子 1013|积分 3039

一、Django构建项目

1.1 创建项目

下令: django-admin startproject 项目名
  1. django-admin startproject django_demo01
复制代码
此中 mysite 是你的项目名称
这时会在指定的项目文件夹中,天生一个 mysite 文件夹,目录结构如下:
  1. django_demo01/
  2.     manage.py
  3.     django_demo01/
  4.                __init__.py
  5.                 settings.py
  6.                 urls.py
  7.                 asgi.py
  8.                 wsgi.py
复制代码
这些目录和文件的说明如下:


  • manage.py 一个让你用各种方式管理 Django 项目的下令行工具。
  • init.py 一个空文件,告诉 Python 这个目录应该被以为是一个 Python 包
  • settings.py 项目的配置文件,有关于数据库、编码、时区等
  • urls.py 项目的 url路由配置,即url路由与其函数的对应配置
  • wsgi.py :作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。
  • asgi.py :作为你的项目的运行在 ASGI 兼容的 Web 服务器上的入口
1.2 启动项目

在该cmd目录下执行如下下令,可以启动项目:
  1. python manage.py runserver
复制代码
该下令后续可以增长参数,如:
  1. python manage.py runserver
  2. 8081python manage.py runserver
  3. 127.0.0.1:8888
复制代码
在欣赏器中访问提示的服务器网址:Starting development server at http://127.0.0.1:8000/ 中的

1.3 创建Django应用

一个项目由许多个应用组成的,每一个应用完成一个功能模块。
创建应用的下令如下: python mange.py startapp应用名称
cmd窗口中,进入最外层的mysite,在这个目录下,我们可以输入如下下令,创建一个新的子应用:
  1. python  manage.py  startapp  app01
复制代码
创建完成后的文件目录结构如下:
  1. ─django_demo01
  2.     │  db.sqlite3
  3.     │  manage.py
  4.     │
  5.     ├─app01
  6.     │  │  admin.py
  7.     │  │  apps.py
  8.     │  │  models.py
  9.     │  │  tests.py
  10.     │  │  views.py
  11.     │  │  __init__.py
  12.     │  │
  13.     │  └─migrations
  14.     │          __init__.py
  15.     │
  16.     └─django_demo01
  17.         │  asgi.py
  18.         │  settings.py
  19.         │  urls.py
  20.         │  wsgi.py
  21.         │  __init__.py
  22.         │
  23.         └─__pycache__
  24.                 settings.cpython-38.pyc
  25.                 urls.cpython-38.pyc
  26.                 wsgi.cpython-38.pyc
  27.                 __init__.cpython-38.pyc
复制代码


  • init.py 是一个空文件,表现当前目录news可以当作一个python包使用。
  • tests.py 文件用于开发测试用例,在现实开发中会有专门的测试人员,这个事情不须要我们来
    做。
  • models.py 文件跟数据库操作相干。
  • views.py 文件跟吸收欣赏器请求,进行处置惩罚,返回页面相干。
  • admin.py 文件跟网站的后台管理相干。
  • migrations 数据库迁移文件。
1.4 应用注册

应用创建乐成后,须要注册才可以使用,也就是建立应用和项目之间的关联,在项目 /settings.py 中
INSTALLED_APPS下添加应用的名称就可以完成注册。
初始项目的INSTALLED_APPS如下图:
  1. INSTALLED_APPS = (
  2.         'django.contrib.admin',
  3.         'django.contrib.auth',
  4.         'django.contrib.contenttypes',
  5.         'django.contrib.sessions',
  6.         'django.contrib.messages',
  7.         'django.contrib.staticfiles',
  8.         'app01',
  9. )
复制代码

1.5 服务说明

能够打开一个django的接待页面,是由于启动了django自带的一个浅易web服务器,它是一个用纯 Python 写的轻量级的 Web 服务器。仅仅用于开发情况,不要在生产情况使用。
在这个服务器中,在须要的情况下会对每一次的访问请求重新载入一遍 Python 代码。所以你不须要为了让修改的代码生效而频繁的重新启动服务器。然而,一些动作,好比添加新文件,将不会触发自动重新加载,这时你得自己手动重启服务器。
二、Djnago请求

2.1 请求流程


2.2 urls.py配置

  1. from django.contrib import admin
  2. from django.urls import path
  3. from app01 import views
  4. urlpatterns = [
  5.     path('admin/', admin.site.urls),
  6.     path('firstRequest/', views.FirstRequest),
  7. ]
复制代码
2.3 views.py

  1. from django.shortcuts import render
  2. from django.http import HttpResponse
  3. # Create your views here.
  4. def FirstRequest(request):
  5.     return HttpResponse("第一个Django请求成功")
复制代码
2.4 启动服务

  1. python manage.py runserver
复制代码
2.5 欣赏器发送请求


此中在views.py文件中,每一个请求方法须要有一个request参数,通过该参数可以获取请求相应信息。可以使用dir(request)检察详细。
  1. [
  2. 'COOKIES', 'FILES', 'GET', 'META', 'POST', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__',
  3. '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',
  4. '__subclasshook__', '__weakref__', '_current_scheme_host', '_encoding', '_get_full_path', '_get_post', '_get_raw_host', '_get_scheme', '_initialize_handlers', '_load_post_and_files'
  5. , '_mark_post_parse_error', '_messages', '_read_started', '_set_content_type_params', '_set_post', '_stream', '_upload_handlers', 'accepted_types', 'accepts', 'body', 'build_absolute_uri', 'close', 'content_params', 'content_type', 'csrf_processing_done', 'encoding', 'environ', 'get_full_path', 'get_full_path_info', 'get_host', 'get_port', 'get_signed_cookie', 'headers', 'is_secure', 'method', 'parse_file_upload', 'path', 'path_info', 'read', 'readline', 'readlines', 'resolver_match', 'scheme', 'session', 'upload_handlers', 'user'
  6. ]
复制代码
2.6 开发第一个登录表单


  • urls.py配置
  1. from django.contrib import admin
  2. from django.urls import path
  3. from app01 import views
  4. urlpatterns = [
  5.     path('admin/', admin.site.urls),
  6.     path('firstRequest/', views.FirstRequest),
  7.     path('login/', views.login),
  8. ]
复制代码

  • views.py添加业务方法
  1. def login(request):
  2.     # 返回页面
  3.     html = '''
  4.        <html>
  5.           <body>
  6.              <form method="post">
  7.               用户名:<input name = "username" type="text"></input></br>
  8.               密码:<input name = "password" type = "password"></input></br>
  9.               <input type="submit" value="登录"></input>
  10.              </form>
  11.           </body>
  12.        </html>
  13.        '''
  14.     # return render(request, 'login.html')
  15.     return HttpResponse(html)
复制代码

  • 欣赏器发送请求测试

三、Django配置

3.1 settings介绍

django项目创建后,在主应用中,会有一个settings.py文件,这个就是该项目的配置文件


  • settings文件包含Django安装的全部配置
  • settings文件是一个包含模块级变量的python模块,所以该模块自己必须符合python规则,而且可以使用python的语法
  • settings中的全部配置项的key必须全部大写
  • settings中每一个配置项都有默认值,默认配置内容在django/conf/global_settings.py中可以检察到,项目中不须要导入该模块,django框架会自动获取
  • settings中可以添加自定义的配置项
可以在global_settings中进行检察
  1. from django.conf import global_settings
复制代码

3.2 应用settings文件


  • manage.py启动
默认在manage.py中配置:
  1. if __name__ == "__main__":
  2.        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "firstdjango.settings")
复制代码

  • 手动指定配置文件位置
cmd下令启动如下:
  1. python manage.py runserver
  2. 0.0.0.0:8000 --settings=firstdjango.settings
复制代码

  • 服务器部署启动
在wsgi.py中配置:
  1. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "firstdjango.settings")
复制代码
3.3 常用配置项分析(重点)

  1. import os
  2. """
  3.     当前文件所在文件夹的上一级目录的绝对路径
  4.     切记2个 os.path.dirname
  5. """
  6. #BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  7. BASE_DIR = Path(__file__).resolve().parent.parent
  8. # E:\Code_Learn\Python全栈工程师\Django\django_demo01
  9. """
  10.     用于加密session,一个随机的字符串
  11.     这样生成:
  12.     from django.core.management import utils
  13.     utils.get_random_secret_key()
  14. """
  15. SECRET_KEY = 'django-insecure-yibecivjsju-iym&5fc!6x9)z$8!u=d7bwnpk6^tfythk)gzc)'
  16. # 调试模式,可以看到错误的所有相信信息,部署时一定要修改为False
  17. DEBUG = True
  18. """
  19.     允许访问的域名设置
  20.     开发环境不用理会
  21.     运行环境,配置 DEBUG = False后,
  22.     如果允许所有域名访问,则设置 ALLOW_HOSTS = ['*']
  23.     如果指定某些域名可以访问,则设置 ALLOW_HOSTS = ['*.baidu.com']
  24. """
  25. ALLOWED_HOSTS = []
  26. """
  27.     应用的配置,
  28.     如:'app01.apps.App01Config'
  29.     如果没有 App01Config,那么可以配置为  'app01'
  30. """
  31. INSTALLED_APPS = [
  32.     'django.contrib.admin',
  33.     'django.contrib.auth',
  34.     'django.contrib.contenttypes',
  35.     'django.contrib.sessions',
  36.     'django.contrib.messages',
  37.     'django.contrib.staticfiles', # 只有 DEBUG = Ture 才有效
  38.    
  39.     'app01'  # 子应用必须配置,否则不起作用
  40. ]
  41. """
  42.     中间层配置
  43.     自己编写的 中间层 需要配置在最后
  44.     譬如:
  45.     mymidlle.md.TestMiddleware
  46. """
  47. MIDDLEWARE = [
  48.     'django.middleware.security.SecurityMiddleware',
  49.     'django.contrib.sessions.middleware.SessionMiddleware',
  50.     'django.middleware.common.CommonMiddleware',
  51.     'django.middleware.csrf.CsrfViewMiddleware',
  52.     'django.contrib.auth.middleware.AuthenticationMiddleware',
  53.     'django.contrib.messages.middleware.MessageMiddleware',
  54.     'django.middleware.clickjacking.XFrameOptionsMiddleware',
  55. ]
  56. # 配置基础的urls
  57. ROOT_URLCONF = 'django_demo01.urls'
  58. # 配置模板
  59. TEMPLATES = [
  60.     {
  61.         'BACKEND': 'django.template.backends.django.DjangoTemplates',
  62.         'DIRS': [os.path.join(BASE_DIR, 'templates')],
  63.         'APP_DIRS': True, # 如果没找到去子应用里去找
  64.         'OPTIONS': {
  65.             'context_processors': [
  66.                 'django.template.context_processors.debug',
  67.                 'django.template.context_processors.request',
  68.                 'django.contrib.auth.context_processors.auth',
  69.                 'django.contrib.messages.context_processors.messages',
  70.             ],
  71.         },
  72.     },
  73. ]
  74. # 服务器部署的WSGI配置
  75. WSGI_APPLICATION = 'django_demo01.wsgi.application'
  76. """
  77.     数据库配置
  78.     mysql在python3的使用,需要在 __init__.py 中加入以下代码:
  79.     import pymysql
  80.     pymysql.install_as_MySQLdb()
  81. """
  82. # DATABASES = {
  83. #     'default': {
  84. #         'ENGINE': 'django.db.backends.sqlite3',
  85. #         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  86. #     }
  87. # }
  88. DATABASES = {
  89.     'default': {
  90.         'ENGINE': 'django.db.backends.mysql',
  91.         'NAME': 'django_test1',
  92.         'USER': 'root',
  93.         'PASSWORD': '123456',
  94.         'HOST': '127.0.0.1',
  95.         'PORT': '3306',
  96.     }
  97. }
  98. """
  99.     用户密码验证
  100. """
  101. AUTH_PASSWORD_VALIDATORS = [
  102.     {
  103.         'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
  104.     },
  105.     {
  106.         'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
  107.     },
  108.     {
  109.         'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
  110.     },
  111.     {
  112.         'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
  113.     },
  114. ]
  115. # 语言选择 , zh-Hans 为中文
  116. LANGUAGE_CODE = 'en-us'
  117. # 时区 Asia/Shanghai 是中国时区
  118. TIME_ZONE = 'UTC'
  119. # 国际化
  120. USE_I18N = True
  121. # 本地化
  122. USE_L10N = True
  123. # 使用时区,配套TIME_ZONE使用,必须设置为 False
  124. USE_TZ = False
  125. """
  126.     静态文件的路径,默认是 static
  127.     如果在各自项目的static目录以外,还有目录存放静态文件,需要添加如下属性:
  128.     STATICFILES_DIRS = (
  129.         os.path.join(BASE_DIR, "common_static1"),
  130.         '/var/www/static/',
  131.     )
  132. """
  133. STATIC_URL = '/static/'
复制代码
3.4 步伐中获取settings中的配置项

假如在项目代码中须要获取settings中的配置项,如许获取:
  1. # 切记不要导入具体的settings模块的路径,会形成高耦合
  2. # 这样的方式是不可取的:from mysite import settings
  3. from django.conf import settings
  4. d = settings.DEBUG
复制代码
四、URL调度器(重点)

4.1 工作原理

​ django通过urlconf来映射视图函数,只区分路径,不区分http方法


  • Django确定要使用的根URLconf模块,一般是在settings中的ROOT_URLCONF设置的值,但是假如传入 HttpRequest 对象具有一个urlconf 属性(由中间件设置),则其值将用于代替 ROOT_URLCONF设置。
  • Django加载该URLconf模块并查找变量 urlpatterns,它是一个列表django.urls.path() 和 / 或django.urls.re_path()实例。
  • Django按顺序遍历每个URL模式,并停在与请求的URL匹配的第一个URL模式,须要特别留意编写的顺序
  • 一旦某个URL模式匹配,Django就会导入并调用给定的视图,该视图是一个简单的Python函数(或基于类的视图方法)。该视图通过以下参数通报:

    • 一个HttpRequest实例。
    • 假如匹配的URL模式没有返回任何定名组,则来自正则表达式的匹配作为位置参数提供。
    • 关键字参数由路径表达式匹配的任何定名部分组成,并由可选的kwargs参数传给 django.urls.path()或django.urls.re_path()。

  • 假如没有URL模式匹配,或者在此过程中的任何点发生异常,Django将调用适当的错误处置惩罚视图
4.2 简单示例


  • 在子应用下创建urls.py,内容如下
  1. urlpatterns = [
  2. ]
复制代码

  • 在项目的应用中添加子应用urls.py配置
  1. from django.contrib import admin
  2. from django.urls import path, include
  3. from app01 import views
  4. urlpatterns = [
  5.     path('admin/', admin.site.urls),
  6.     path('firstRequest/', views.FirstRequest),
  7.     path('login/', views.login),
  8.     path('app01/', include('app01.urls'))
  9. ]
复制代码

  • 配置子应用urls.py
  1. from django.contrib import admin
  2. from django.urls import path, include
  3. from app01 import views
  4. urlpatterns = [
  5.     path('admin/', admin.site.urls),
  6.     path('firstRequest/', views.FirstRequest),
  7.     path('login/', views.login),
  8.     path('app01/', include('app01.urls'))
  9. ]
复制代码

  • 欣赏器进行访问
http://127.0.0.1:8000/app01/login/

4.3 路由中的参数匹配

配置项目的urls.py
  1. from django.contrib import admin
  2. from django.urls import path, include
  3. from app01 import views
  4. urlpatterns = [
  5.     path('admin/', admin.site.urls),
  6.     path('firstRequest/', views.FirstRequest),
  7.     path('login/', views.login),
  8.     path('app01/', include('app01.urls'))
  9. ]
复制代码
配置app01的urls.py
  1. from django.urls import path, include
  2. from . import views
  3. urlpatterns = [
  4.     path('login/', views.login),
  5.     path('articles/2024/', views.articles_2024),
  6.     path('articles/<int:year>/', views.articles_year),
  7.     path('articles/<int:year>/<int:month>/', views.articles_year_month),
  8.     path('articles/<int:year>/<int:month>/<slug:slug>/', views.articles_year_month_slug),
  9.     path('articles/<str:str>/', views.str_test),
  10.     path('articles/<path:path>/', views.path_test),
  11.     path('articles/<uuid:uuid>/', views.uuid_test)
  12. ]
复制代码
app01的views.py
  1. # 创建articles 2024处理函数
  2. def articles_2024(request):
  3.     return HttpResponse('articles 2024')
  4. def articles_year(request, year):
  5.     return HttpResponse(f'article_year, year:{year}')
  6. def articles_year_month(request, year, month):
  7.     return HttpResponse(f'article_year_month, year:{year},month:{month}')
  8. def articles_year_month_slug(request, year, month, slug):
  9.     return HttpResponse(f'article_year_month_slug, year:{year}, month:{month}, slug:{slug}')
  10. def str_test(request, str):
  11.     return HttpResponse(f'str_test: {str}')
  12. def path_test(request, path):
  13.     return HttpResponse(f'path_test: {path}')
  14. def uuid_test(request, uuid):
  15.     return HttpResponse(f'uuid_test: {uuid}')
复制代码
测试:
   按照从上往下的顺序依次测试和匹配。
  







   留意:测试uuid要解释掉str
  笔记:


  • 从URL中捕获值,请使用尖括号
  • 捕获的值可以选择包含转换器类型。比方,用于 <int:name>捕获,前面的int指整数参数,name是参数的名称
  • 没有须要添加一个前导斜杠,由于每个URL都有,比方,使用articles而不是/articles。
  • 示例请求说明:

    • /articles/2005/03/ 匹配列表中的第三个条目。Django会调用这个函数,views.month_archive(request, year=2005, month=3)
    • /articles/2003/*会匹配列表中的第一个模式,而不是第二个模式,由于模式是按顺序测试的,而第一个模式是第一个要通报的测试。看看使用匹配顺序插入像如许的特别情况。在这里,Django会调用这个函数 views.special_case_2003(request)
    • /articles/2003*不匹配任何这些模式,由于每种模式都要求URL以斜线末端,不过在欣赏器访问时,会自动添加 / 。
    • /articles/2003/03/building-a-django-site/ 将匹配最终模式。Django会调用这个函数 。views.article_detail(request, year=2003, month=3, slug=“building-a-django-site”)

路径转换器


  • str:匹配任何非空字符串,不包括路径分隔符’/'。假如转换器不包含在表达式中,这是默认值。
  • int:匹配零或任何正整数。返回一个int。
  • slug:匹配由ASCII字母或数字组成的字符串,以及横线和下划线字符。比方, building-your-1st-django_site可以匹配,django_@site是不可以匹配的。
  • uuid:匹配格式化的UUID。为防止多个URL映射到同一页面,必须包含破折号,而且字母必须是小写。比方,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID实例。
  • path:匹配任何非空字符串,包括路径分隔符 ‘/’,可以匹配完整的URL路径,而不但仅是URL路径的一部分str,使用时要审慎,由于可能造成后续的全部url匹配都失效。
UUID的天生:
  1. #获取uuid
  2. import uuid
  3. print(uuid.uuid1())
复制代码
4.4 自定义路径转换器

转换器是一个包含以下内容的类:


  • 一个regex类属性,作为一个re匹配字符串。
  • to_python(self, value)方法,它处置惩罚匹配的字符串转换成要通报到视图函数的类型。
  • to_url(self, value)方法,用于处置惩罚将Python类型转换为URL中使用的字符串。
定义方式如下:

  • 新建一个converters.py文件,在文件中定义一个FourDigitYearConverter类:
  1. class FourDigitYearConverter(object):
  2.     regex = '[0-9]{4}'
  3.     def to_python(self, value):
  4.         return int(value)
  5.     def to_url(self, value):
  6.         return '%04d' % value
复制代码

  • 使用register_converter()方法在URLconf中注册自定义转换器类 :
  1. from django.urls import path, include
  2. from . import views
  3. from .converters import FourDigitYearConverter
  4. from django.urls import register_converter
  5. register_converter(FourDigitYearConverter, 'yyyy')
  6. urlpatterns = [
  7.         # 自定义路径转换器path
  8.         path('articles/<yyyy:year>/', views.articles_year)
  9. ]
复制代码

4.5 使用正则表达式

​ 使用正则表达式匹配路径,请使用 re_path()而不是path()
​ 在Python正则表达式中,定名正则表达式组的语法是(?P<name>pattern),此中name是组的名称,而且 pattern是一些要匹配的模式
​ 示例:
  1. from django.urls import path, re_path
  2. from . import views
  3. # url() 是 re_path 的别名,不推荐使用
  4. urlpatterns = [
  5.         re_path(r'^articles/(?P<year>[0-9]{4})/$', views.articles_year),
  6.     re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.articles_year_month()),
  7.     re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.articles_year_month_slug)
  8. ]
复制代码

​ 留意事项:


  • 匹配的URL会受到一些限制。比方,年份10000将不再匹配,由于年份整数限制为四位数字
  • 无论正则表达式匹配什么类型,每个捕获的参数都以字符串的情势发送到视图
  • 除了定名的组语法,比方(?P<year>[0-9]{4}),也可以使用较短的未定名组,比方([0-9]{4}),但是不建议如许使用,会引起未知的匹配
嵌套参数:
  1. from django.urls import re_path
  2. urlpatterns = [
  3.     # 不推荐, 匹配 blog/page-3/
  4.     re_path(r'^blog/(page-(\d+)/)?$', blog_articles),
  5.     # 推荐 ,匹配:comments/page-2/  路径到 comments(request, page_numer)
  6.     re_path(r'^comments/(?:page-(?P<page_number>\d+)/)?$', comments),
  7. ]
  8. def comments(request, page_number):
  9.     return HttpResponse(f'comments:page_number:{page_number}')
复制代码

4.6 使用默认值

​ URLConf中:
  1. from django.urls import path
  2. from . import views
  3. urlpatterns = [
  4.     path('blog/', views.do_page),
  5.     path('blog/<int:num>/', views.do_page),
  6. ]
复制代码
​ views中:
  1. def do_page(request, num=1):
  2.     print(num)
  3.     return HttpResponse(f'do_page:num:{num}')
复制代码
默认值


4.7 错误处置惩罚



  • handler400- 状态码400
  • handler403- 状态码403
  • handler404- 状态码404
  • handler500- 状态码500

  • 在 settings中修改配置:
  1. DEBUG = False
  2. ALLOWED_HOSTS = ['*']
复制代码

  • 在主应用的urls中配置:
  1. # app01是子应用
  2. handler404 = "app01.views.page_not_found"
复制代码

  • 在app01应用的views中添加函数page_not_found:
  1. def page_not_found(request, exception):
  2.      return HttpResponse('自定义的404错误页面')
复制代码

  • 欣赏器测试访问,找不到匹配的路由

4.8 引用其他URL调度器


  • 多个 patterns
  1. from django.urls import include, path
  2. extra_patterns = [
  3.      path('blog/', views.do_page),
  4.           path('blog/<int:num>/', views.do_page),
  5. ]
  6. urlpatterns = [
  7.     path('', include(extra_patterns))
  8. ]
复制代码

  • 使用include消除重复前缀
  1. from django.urls import path
  2. from . import views
  3. urlpatterns = [
  4.      path('<page_slug>-<page_id>/history/', views.history),
  5.      path('<page_slug>-<page_id>/edit/', views.edit),
  6.      path('<page_slug>-<page_id>/discuss/', views.discuss),
  7.      path('<page_slug>-<page_id>/permissions/', views.permissions),
  8. ]
  9. # 修改为:
  10. from django.urls import include, path
  11. from . import views
  12. urlpatterns = [
  13.      path('<page_slug>-<page_id>/', include([
  14.          path('history/', views.history),
  15.          path('edit/', views.edit),
  16.          path('discuss/', views.discuss),
  17.          path('permissions/', views.permissions),
  18.      ])),
  19. ]
复制代码
举例子
  1. from django.urls import path, include, re_path
  2. from . import views
  3. extra_patterns = [
  4.     # 使用默认值
  5.     path('blog/', views.do_page),
  6.     path('blog/<int:num>/', views.do_page),
  7. ]
  8. urlpatterns = [
  9.     path('articles/', include([
  10.         path('2024/', views.articles_2024),
  11.         path('<int:year>/', views.articles_year),
  12.         path('<int:year>/<int:month>/', views.articles_year_month),
  13.     ]))
  14. ]
复制代码

  • 通报捕获的参数
在主urls中配置:
  1. urlpatterns = [
  2.     path('admin/', admin.site.urls),
  3.     # 这里捕获username参数,类型为字符串
  4.     path('<username>/app01/', include('app01.urls'))
  5. ]
复制代码
对应的 app01应用下的urls中配置:
  1. urlpatterns = [
  2.     path('arg_test/', views.arg_test),
  3. ]
复制代码
对应的app01应用下的views中编写函数:
  1. def arg_test(request, username):
  2.     # 编写对应的业务逻辑
  3.     return HttpResponse(f'username {username}')
复制代码

4.9 额外的参数

  1. from django.urls import path
  2. from . import views
  3. urlpatterns = [
  4.     # 会传递给 views.param_test(request, user, password)
  5.     path('param_test/', views.param_test, {'user': 'root', 'password': '1234'}),
  6. ]
复制代码
app01.views.py
  1. def param_test(request, user, password):
  2.     return HttpResponse(f'user {user}, password {password}')
复制代码

4.10 URL反向分析

url调度器除了从用户发起请求,到匹配对应的view,还能在python步伐中调用进行匹配,通过 path或re_path 中 的name属性进行分析


  • 在模板中,使用url模板标签
  • 在Python代码中(主要是views),使用 reverse() 函数
  • 在模子实例中,使用 get_absolute_url() 方法
示例:
app01的urls中配置:
  1. from django.urls import path
  2. from . import views
  3. urlpatterns = [
  4.     path('reverse/', views.reverse_test),
  5.     path('articles/<int:year>/', views.year_archive, name='news-year-archive')
  6. ]
复制代码
views.py
  1. def reverse_test(request):
  2.     return HttpResponseRedirect(reverse('news-year-archive', args=(6666,)))
  3. def year_archive(request, year):
  4.     return HttpResponse(f"year_archive: year:{year}")
复制代码
测试:

2 在模板中测试

  • urls.py
  1. from django.urls import path, include, re_path
  2. from . import views
  3. urlpatterns = [
  4.    path('do_html/', views.do_html),
  5. ]
复制代码

  • 模板中代码
  1. <!--模板中: -->
  2. <a href="{% url 'news-year-archive' 2004 %}">url反向解析测试</a>
复制代码

  • views.py跳转到页面
  1. def year_archive(request, year):
  2.     return HttpResponse(f"year_archive: year:{year}")
  3. def do_html(request):
  4.     return render(request, 'redirect_test.html')
复制代码

4.11 定名空间

主要用于配合第 10 点 url反向分析 使用,多个差别的urls文件中可能配置同名的 name,那么为了进行区分,给差别的urls进行差别的定名,牢记同一个项目下定名空间不能重复!
通过在 url调度器的模块中,定义 app_name = ‘app01’ 来定名
  1. from django.urls import path
  2. from . import views
  3. # 定义,一般命名空间和子应用名相同,便于记忆
  4. app_name = "app01"
  5. urlpatterns = [
  6.     path('reverse/', views.reverse_test),
  7.     path('do_html/', views.do_html),
  8.     ...
  9. ]
  10. # 调用,一旦有了命名空间,调用时就必须使用app01: 前缀
  11. def reverse_test(request):
  12.     return HttpResponseRedirect(reverse('app01:news-year-archive', args=(6666,)))
  13. <a href="{% url 'app01:news-year-archive' 2004 %}">url反向解析测试</a>  
复制代码
定名空间可以进行嵌套:
  1. # 在 urls 中配置如下:
  2. from django.urls import path
  3. from . import views
  4. # 定义命名空间,一般命名空间名和子应用名相同,便于记忆
  5. app_name = 'app01'
  6. extra_patterns = (
  7.     [
  8.         path('app_name/', views.app_name, name='app_name'),
  9.     ],
  10.     # 此处就是嵌套的命名空间
  11.     'extra'
  12. )
  13. urlpatterns = [
  14.     path('', views.IndexView.as_view(), name='index'),
  15.     path('<int:pk>/', views.DetailView.as_view(), name='detail'),
  16.     path('extra/', include(extra_patterns)),
  17.     ...
  18. ]
  19. # 在模板中使用:
  20. <a href="{% url 'app01:extra:app_name' %}">点击链接</a>
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表