Django框架-5

这篇具有很好参考价值的文章主要介绍了Django框架-5。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

路由系统

通过URL(Uniform Resource Locator,统一资源定位符)可以访问互联网上的资源——用户通过
浏览器向指定URL发起请求,Web服务器接收请求并返回用户请求的资源,因此可以将URL视为用户与服务器之间交互的桥梁。

在Django当中,路由系统的本质就是URL与要调用URL的视图函数的一个映射表,它的主要作用就
是让views里面的执行函数与请求的url建立映射关系,当请求来了的时候根据这个url映射来调用对应的
执行函数,从而返回给客户端相应的信息

Django处理请求的流程

当用户向你的Django站点请求一个页面时,系统会采用一个算法来确定要执行哪一段Python代码:

  1. 首先,Django会使用根路由解析模块(root URLconf)来解析路由。

  2. Django加载该Python模块并查找变量 urlpatterns 。 它应该是 django.urls.path() 或者django.urls.re_path() 实例的Python列表。

  3. Django按顺序遍历每个URL pattern,并在第一个匹配的请求URL被匹配时停下。

  4. 一旦某个URL pattern成功匹配,Django会导入并调用给定的视图,该视图是一个简单的Python
    函数(或基于类的视图)。

这个视图会被传以以下参数:
一个 HttpRequest 的实例。
如果所匹配的正则表达式返回的是若干个无名组,那么该正则表达式所匹配的内容将被作为
位置参数提供给该视图。
关键字参数是由路径表达式匹配的任何指定部件组成的,在可选的 kwargs 参数中指定的任
何参数覆盖到 django.urls.path() 或 django.urls.re_path() 。

5.如果请求的URL没有匹配到任何一个表达式,或者在匹配过程的任何时刻抛出了一个异常,那么
Django 将调用适当的错误处理视图进行处理

URL配置

一个项目允许有多个urls.py,但Django需要一个urls.py作为入口,这个特殊的urls.py就是根
URLconf(根路由配置),它由settings.py文件中的ROOT_URLCONF指定

这条代码实在setting.py文件中

ROOT_URLCONF = 'mysite.urls'

以上示例通过ROOT_URLCONF指定了mysite目录下的urls.py作为根URLconf

为保证项目结构清晰,开发人员通常在Django项目的每个应用下创建urls.py文件,在其中为每个应用
配置子URL。路由系统接收到HTTP请求后,先根据请求的URL地址匹配根URLconf,找到匹配的子应用,再进一步匹配子URLconf,直到匹配完成
Django框架-5,python,django,sqlite,数据库

路由测试

1.创建新的项目
2.现将urls.py文件
3.views.py文件编写一个子应用

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
    return HttpResponse('路由测试')

4.在子应用中的urls.py文件中创建子路由

from django.contrib import admin
from django.urls import path
from  urlAPPS.views import index

urlpatterns = [
    path('index/', index),
]

5.在总项目的路由中添加上子路由

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

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

6.在views.py文件中添加新的子应用

def special_case_2022(request):
    return HttpResponse('路由测试1')

def year_archive(request, year):
    return HttpResponse(f"year_archive{year}")

def month_archive(request, year, month):
    return HttpResponse(f"month_archive 年:{year} 月:{month}")

def article_detail(request, year, month, slug):
    return HttpResponse(f"article_detail 年:{year} 月:{month} {slug}")

7.在子路由中添加路由地址

path('articles/2022/', views.special_case_2022),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),

路由转换器

Django2以上内置路由转换器可以显式地指定路由中参数的数据类型,Django中内置了5种路由转
换器,分别为str、int 、slug 、uuid 和path

str:匹配任何非空字符串,但不包含路由分隔符“/”。如果URL中没有指定参数类型,默认使用该
类型。

int:匹配0或任何正整数。并作为 int 返回。

slug:匹配由字母、数字、连字符和下划线组成的URL。例如, building-your-1st-django-site

uuid:匹配一个uuid格式的字符串。为了防止多个URL映射到同一页面中,该转换器必须包含连
字符,且所有字母均为小写。例如, 075194d3-6885-417e-a8a8-6c931e272f00 . 返回一个 UUID
实例

path:匹配包含路径分隔符 ‘/’ 在内的任意非空字符串。 相对于 str ,这允许你匹配一个完整的
URL路径,而不仅仅是URL路径的一部分。

from django.contrib import admin
from django.urls import path
from urlAPPS.views import index
from urlAPPS import views

urlpatterns = [
    path('index/', index),
    path('articles/2022/', views.special_case_2022),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
    # str字符串类型测试
    path('articles/<str:year>/', views.str_cs),
]


正则表达式

如果路径和转换器语法不足以定义你的URL pattern,你还可以使用正则表达式。 为了使用正则表
达式,请使用 re_path() ,而不要使用 path() 。

在Python正则表达式中,命名正则表达式组的语法是 (?Ppattern) , 这里 name 是表达式组的名字
而 pattern 是要匹配的模式。

 re_path(route, view, kwargs=None, name=None)

注意:
无论正则表达式匹配什么类型,每个捕获的参数都会以字符串形式传给视图。

正则表达式格式为:(?Ppattern),其中name表示分组名,pattern表示匹配的正则表达式。URL
匹配成功后,捕获到的参数会作为关键字参数传递给对应的视图,因此视图中的形式参数必须和正
则表达式中的分组名相同

若正则表达式只通过小括号“()”来捕获URL的参数,但未为其命名,则它是一个未命名正则表达
式,此时捕获的参数并将其以位置参数形式传递给对应视图

from django.contrib import admin
from django.urls import path , re_path
from urlAPPS.views import index
from urlAPPS import views

urlpatterns = [
    # 路由转换器
    path('index/', index),
    # path('articles/2022/', views.special_case_2022),
    # path('articles/<int:year>/', views.year_archive),
    # path('articles/<int:year>/<int:month>/', views.month_archive),
    # path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
    # str字符串类型测试
    # path('articles/<str:year>/', views.str_cs),
    # 正则表达式
    re_path('articles/2021/$', views.re_special_case_2022),
    re_path('articles/(?P<year>[0-9]{4})/$', views.re_year_archive),
    re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.re_month_archive),
    re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[-_\w]+) / $', views.re_article_detail),
]

向视图传递额外参数

path()函数、re_path()函数允许向视图传递额外参数,这些参数存放在一个字典类型的数据中,该
数据的键代表参数名,值代表参数值。re_path()函数与path()函数传递额外参数方式相同,以path()函数为例介绍如何向视图传递额外参数。

使用path()函数的第三个参数可以向视图传递额外参数

路由解析顺序

Django在接收到一个请求时,从主路由文件中的urlpatterns列表中以由上至下的顺序查找对应路
由规则,如果发现规则为include包含,则再进入被包含的urls中的urlpatterns列表由上至下进行
查询

反斜线问题

Django中定义路由时,通常以斜线/结尾,其好处是用户访问不以斜线/结尾的相同路径时,
Django会把用户重定向到以斜线/结尾的路径上,而不会返回404不存在文章来源地址https://www.toymoban.com/news/detail-522150.html

views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
    return HttpResponse('路由测试')

def special_case_2022(request):
    return HttpResponse('路由测试1')

def year_archive(request, year):
    return HttpResponse(f"year_archive{year}")

def month_archive(request, year, month):
    return HttpResponse(f"month_archive 年:{year} 月:{month}")

def article_detail(request, year, month, slug):
    return HttpResponse(f"article_detail 年:{year} 月:{month} {slug}")

def str_cs(request,city):
    print('city的类型:',type(city))
    return HttpResponse(f'str_cs{city}')

'''正则表达式'''
def re_special_case_2022(request):
    return HttpResponse('路由测试1')

def re_year_archive(request, year):
    return HttpResponse(f"year_archive{year}")

def re_month_archive(request, year, month):
    return HttpResponse(f"month_archive 年:{year} 月:{month}")

def re_article_detail(request, year, month, slug):
    return HttpResponse(f"article_detail 年:{year} 月:{month} {slug}")

'''传递额外参数'''
def blog_year_archive(request, year, major):
    return HttpResponse(f"blog_year_archive 年 {year} 额外参数:{major}")

def re_blog_year_archive(request, year, major):
    return HttpResponse(f"blog_year_archive 年 {year} 额外参数:{major}")
urls.py
from django.contrib import admin
from django.urls import path , re_path
from urlAPPS.views import index
from urlAPPS import views

urlpatterns = [
    # 路由转换器
    path('index/', index),
    # path('articles/2022/', views.special_case_2022),
    # path('articles/<int:year>/', views.year_archive),
    # path('articles/<int:year>/<int:month>/', views.month_archive),
    # path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
    # str字符串类型测试
    # path('articles/<str:year>/', views.str_cs),
    # 正则表达式
    # re_path('articles/2021/$', views.re_special_case_2022),
    # re_path('articles/(?P<year>[0-9]{4})/$', views.re_year_archive),
    # re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.re_month_archive),
    # re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[-_\w]+) / $', views.re_article_detail),
    # 传递额外参数
    path('blog/<int:year>/', views.blog_year_archive, {'major': 'python'}),
    re_path('blog/(?P<year>[0-9]{4})/$', views.re_blog_year_archive, {'major':'python'}),
]

到了这里,关于Django框架-5的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • django框架——实现MySQL数据库数据的删除

    在html中的删除按钮中绑定js文件中的事件,带上参数,点击即触发(删除按钮不能是a链接,不然报错) js文件中实现该功能,发起ajax请求到后端视图中对数据库进行操作 路由导入 在视图里面实现删除功能

    2024年02月13日
    浏览(57)
  • 【python】Django——连接mysql数据库

    笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 Django——连接mysql数据库 ORM(Object-Relational Mapping)是一种编程技术,它允许开发者使用面

    2024年02月04日
    浏览(55)
  • Python Django 之连接 Mysql 数据库详解

    博客:https://blog.csdn.net/qq_34745941/article/details/122549376 若已安装,请忽略。 主要使用的文件如图 若 pip 安装失败,可进入 Python 官方库中下载 whl 文件,操作可参考: 博客:https://blog.csdn.net/qq_34745941/article/details/106341898 在 settings.py 中,配置 Mysql 的连接串 扩展: Django 也支持其

    2024年02月04日
    浏览(52)
  • Django ORM:数据库操作的Python化艺术

    Django的对象关系映射器(ORM)是其核心功能之一,允许开发者使用Python代码来定义、操作和查询数据库。这篇文章将带你深入了解Django ORM的强大之处,从基本概念到高级查询技巧,提供丰富的示例帮助你掌握使用Django ORM进行有效和高效的数据库操作。 Django ORM的目的是提供一

    2024年02月04日
    浏览(58)
  • python#django数据库一对一/一对多/多对多

    搭建 # 一对一 class   TestUser(models.Model):     username=models.CharField(max_length=32)     password = models.CharField(max_length=32) class TestInfo(models.Model):     mick_name=models.CharField(max_length=32)     user=models.OneToOneField(to=TestUser,on_delete=models.CASCADE()#on_delete 删除的模式 CASCADE 级联删除 让后执行数

    2024年02月14日
    浏览(73)
  • python+django+mysql项目实践二(前端及数据库)

    Pycharm 开发环境 Django 前端 MySQL 数据库 Navicat 数据库管理 添加模板 在templates下创建 views文件中添加 在setting文件中进行配置 在Terminal输入命令下发指令

    2024年02月14日
    浏览(57)
  • 微信小程序提交数据,python的django框架接收

    一、微信小程序部分,这里要注意:content-type的设置与后台接收的格式相关,在这里设置成application/x-www-form-urlencoded 二、python部分,这里用 json.loads方法加载整个 request.body,因为整个body就是一个json数据 原始数据是这样的:

    2024年02月12日
    浏览(39)
  • python+django迁移数据库成功但是数据库中还没表产生

    1、删除原来的文件(我这没了,反正就是之前执行下面两条命令生成的文件) 2、检查settings.py中DATABASES参数,首先是数据库的信息对不对。我这里是因为ENGINE=“django.db.backends.sqlite3” 因为我使用的数据库是mysql,所以修改成“django.db.backends.mysql”就好了,就这搞了一天,真

    2024年02月11日
    浏览(67)
  • 基于python重庆招聘数据爬虫采集系统设计与实现(django框架)

     博主介绍 :黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、

    2024年01月23日
    浏览(45)
  • Python学习笔记-Django框架基础,APP,数据模型,后台管理,路由

    Django框架是Python的常用web框架,遵循 MVC 设计模式的框架,采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包