53.django路由层的简单配置及反向解析
Posted learningonline
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了53.django路由层的简单配置及反向解析相关的知识,希望对你有一定的参考价值。
0.上节关键命令
创建一个Django项目:django-admin startproject projectname
创建一个项目下的应用:python3 manage.py startapp appname
运行:python3 manage.py runserver (IP PORT)
1.url配置(URLconf)
功能:建立起url与视图函数的映射关系。通过这种方式告诉django,客户端发来的某个url调用哪一段逻辑代码对应执行
基本语法:url(正则表达式规则,视图函数)
url下的path是django2.0的语法,re_path属于1.0的语法,目前2.0也兼容这种语法,导入即可
url部分
urlpatterns = [ # 用户在url中输入127.0.0.1:8000/articles/2003/,可以直接调用函数 url(r‘^articles/2003/$‘, views.special_case_2003), # 利用优先匹配,获取用户输入年月 url("^articles/(d{4})/(d{2})/$", views.article_month), # 什么都不写也会默认访问这一个index视图,这个也很重要 url(r‘^$‘, views.index), ]
views部分
from django.shortcuts import render,HttpResponse,redirect from django.urls import reverse # Create your views here. def special_case_2003(request): return HttpResponse(‘get it‘) def article_month(request,year,month): print(year, type(year)) print(month, type(month)) return HttpResponse(year + ":" + month) def index(request): return HttpResponse(‘首页默认显示‘)
注:
若要在url中捕获一个值,只需要在他周围防止一对圆括号,如上例
不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles
而不是 ^/articles
。
每个正则表达式前面的‘r‘ 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义
1.2有名分组
上面简单配置只是通过简单配置来捕获URL中的值,并通过位置参数传给视图,可以使用命名的正则表达式组来捕获URL 中的值并以关键字参数传递给视图。
url部分
from django.conf.urls import url from app import views # 有名分组 urlpatterns = [ url("^articles/(?P<year>d{4})/(?P<month>d{2})/(?P<day>d+)/$",views.article_day) # article_year(request,year=2000,month=12,day=12) ]
views部分
from django.shortcuts import render,HttpResponse,redirect from django.urls import reverse # 这里形参无论怎么放置都无所谓了 def article_day(request,month,day,year): return HttpResponse(year + "-" + month + "-" + day)
1.3 分发
首先需要引入一个函数include(看urls.py下的注释),当你存在多个app的时候,彼此互不影响,各自从各自的app中去查找,好处是用于解耦
from django.urls import path,include urlpatterns = [ path(‘app01/‘,include("app01.urls")), path(‘app02/‘,include("app02.urls")), ]
1.4 反向解析(重要的一个功能)
url下的名字由于业务需求领导要求变更,这意味用到该路径的地方都需要更改,模板中用到这个名字的地方都需要改,一个项目中可能包含几十个模板文件,此时意味着维护起来代价相当高,此时则引入了反向解析这种语法,通过使用别名name来提高代码的灵活性。
url部分(不管怎么变动,我们只需更改这里的url部分即可,大大减少了工作量)
from django.urls import path from app import views urlpatterns = [ path("login/", views.login, name="log_in"), path("index/", views.index, name="index"), ]
视图部分
from django.shortcuts import render,HttpResponse,redirect from django.urls import reverse # 导入反向解析的一个函数 def login(request): if request.method == ‘POST‘: user = request.POST.get(‘user‘) pwd = request.POST.get(‘pwd‘) if user==‘bob‘ and pwd==‘123‘: # 登录成功后直接跳转到首页index,即重定向, # 不过下面这样写就又被写死了,如果url中一改这里也需要改动 # 现在也需要通过在url下使用别名 # return redirect("index") # 硬编码 url = reverse("index") # 反向解析 print("url", url) # url /index/ return redirect(url) return render(request,"login.html") def index(request): return HttpResponse(‘跳转成功‘)
模板部分(login.html)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {#注意这里内容必须要放在form表单里,否则无法实现跳转#} <form {% url ‘log_in‘ %} method="post"> 姓名:<input type="text" name="user"> 密码:<input type="password" name="pwd"> <input type="submit"> </form> </body> </html>
注:
思路其实通过以不变(别名name)应万变
在模板(html文件)中:
{% url ‘别名’ %}
在视图函数(Python脚本)中:
from django.urls import reverse
url=reverse(别名)
以上是关于53.django路由层的简单配置及反向解析的主要内容,如果未能解决你的问题,请参考以下文章
Django之路由层 (有名和无名分组 反向解析 路由分发 名称空间)
Flask框架—— 反向解析配置信息路由系统模板请求响应闪现请求扩展session