python学习之路博客专栏《Django By Example》

【Django】路由配置:反向解析、重定向

2019-08-07  本文已影响8人  Alcazar

简单的路由配置

from django.conf.urls import url

urlpatterns = [
     url(正则表达式, views视图函数,参数,别名),
]

【注意事项】:

(1):若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
(2):不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
(3):每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义
(4):urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续

from django.contrib import admin from django.urls import path,re_path
from app01 import views
urlpatterns = [    path('admin/', admin.site.urls),

# 路由配置:路径 ----> 视图函数    
re_path(r'^articles/2003/$', views.special_case_2003),    
# ^articles/2003/$ :正则匹配;匹配以articles/2003/开头、以articles/2003/结尾的路径; 唯一匹配
re_path(r'^articles/([0-9]{4})/$', views.year_archive),    
# ([0-9]{4}) 是一个分组匹配(加了括号);匹配到路径后,request会传入 year_archive 函数的 第一个参数;
#分组匹配结果会以位置参数传入到year_archive函数的第二个参数, 
#e.g. year_archive(r equest,1999);so year_archive函数需要有两个参数    
# 从上到下执行,所以如果匹配到了2003,会走第一个路径,下面的不再执行    
# 匹配分组之后,视图函数一定要传入相应的位置参数
re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive)

 # 同理, month_archive需要有三个参数

re_path(r'^articles/(?P<y>[0-9]{4})/(?P<m>[0-9]{2})/(?P<c>[0-9]+)/$', views.article _detail)
 
# (?P<名字>):这是有名分组(就是给每个组取了个名字,用的比较多),有名分组利用的是关键字传参;   
 # 有名分组取的名字一定要和后面函数的形参相同;有名分组传参不依赖于位置顺序 

反向解析

在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。

在需要URL 的地方,对于不同层级,Django 提供不同的工具用于URL 反查:

反向解析的过程:用户通过 /login/ 这个接口 到达urls.py,然后通过 path("login/",views.login,name="log") 到达 views.py(用于视图函数)

 # request.method 表示获取 请求方式(GET/POST)

# request.GET 表示获取所有的 GET请求数据;字典的形式        
# <QueryDict: {}>        

 # 反向解析的过程:用户通过 /login/ 这个接口 到达urls.py,然后通过 path("login/",vie ws.login,name="log") 到达 views.py(视图层)     
   
# render(request, "login.html") 方法在渲染 login.html 这个页面的时候,
#会在 action ="{% url 'log' %}" 这一步 找到别名为 "log" 的url,并将 {% url 'log' %} 替换为该url        

# request.PSOT 表示获取所有的 POST请求数据;字典的形式        
# < QueryDict: {'username': ['123'], 'psw': ['123']} >
# 获取请求体(POST)                 
# 每次请求一定要有 返回值     

重定向

在实现逻辑功能时,可能会需要实现重定向的功能。

(1)、通过redirect函数或HttpResponseRedirect函数硬编码的形式

from django.shortcuts import redirect,HttpResponseRedirect

return redirect('/app1/alluser/')  # 硬编码形式
return redirect('/app1/finduser/?userid=62')  # 传递参数
--------------------- 

(2)、通过URLconf路由命名空间的形式。

return redirect('app1_name:alluserpath')

(3)、如果在逻辑函数中不做任何处理,可以直接在url中配置。

上一篇 下一篇

猜你喜欢

热点阅读