路由层简单配置
urlpatterns = [ url(r'^admin/$', admin.site.urls), url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/([0-9]{4})/$', views.year_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), ]
在url中加括号(无名分组)是为了捕获值传给后面的视图函数,注意此时是以位置参数传入的,当参数比较多或者需要调整参数顺序时可以改为有名分组以关键字参数的形式传入
urlpatterns = [ path('admin/', admin.site.urls), path('articles/2003/', views.special_case_2003), re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]+)/$', views.article_detail), ]
路由分发
实际项目中不可能只有一个app,如果所有url都放在一个url文件里,那么如果一个app里的url出问题整个项目就崩溃了,因此需要解耦,将不同app的url分配到对应的app的url文件中,这就是url分发
mysite/urls.py
from django.urls import path, include urlpatterns = [ # path('admin/', admin.site.urls), # django 2.0以后的写法 # url('^articles/2003/$', views.special_case_2003), # 1.0的写法 # 路由分发:将不同app的路由(url)分发到不同的url里面 # include作用:自动去掉后面的$,完成分发 path('app1/', include('app1.urls')), # 只要是app1下面的url,就分发到app1.urls这个文件里面 path('app2/', include('app2.urls')) # # 只要是app2下面的url,就分发到app2.urls这个文件里面 ]
app1/urls.py
from django.conf.urls import url from app1 import views urlpatterns = [ # 有名分组 url(r'^articles/(?P<y>d{4})/(?P<m>d{1,2})$', views.month_archive), # 用正则进行匹配,匹配成功执行后面的函数 ]
app2/urls.py
urlpatterns = [ # 有名分组 url(r'^videos/(d+)', views.videos), ]
app1/views.py
from django.shortcuts import HttpResponse def month_archive(request, year, month): return HttpResponse('year:{0},month:{1}'.format(year, month))
app2/views.py
from django.shortcuts import HttpResponse def videos(request, video_id): return HttpResponse('videos:%s' % video_id)
反向解析
在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。
因此Django提供了一种方法,给URL指定别名,在需要URL 的时候,我们只需要把别名反解出来就行,对于不同层级,Django 提供不同的工具用于URL 反解:
- 在模板中,使用url模板标签
- 在python代码中,使用reverse函数
urls.py
urlpatterns = [ path('admin/', admin.site.urls), path('login/', views.login, name="login"), # 指定别名
path('index/', views.index, name="index"), # 指定别名
]
login.html
<form action="{% url 'login' %}" method="post"> <p>用户名:<input type="text" name="user"></p> <p>密码:<input type="password" name="pwd"></p> <input type="submit"> </form>
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>个人首页...</h1> </body> </html>
views.py
from django.shortcuts import render, HttpResponse, redirect from django.urls import reverse def login(request): if request.method == "POST": username = request.POST.get("user") pwd = request.POST.get("pwd") if username == "alex" and pwd == "123": return redirect(reverse("index")) return render(request, "login.html")
def index(request):
render(request,'index.html')