03-路由控制1——简单示例+有名分组及一个高级用法
路由控制之简单配置————哪一个路由由哪一个视图函数去处理
全局的urls.py文件中
在“全局”的urls里额外引入一个re_path
from django.urls import path,re_path
from app01 import views
urlpatterns = [
path('admin/',admin.site.urls),
path('login',views.login),
#路由配置————哪一个路径由哪一个视图函数去处理(这里是新的内容)
#调用的时候会自动传一个request参数,如special_case_2003(request)
re_path(r'^articles/2003/$',views.special_case_2003),
#下面的效果跟上面一样,只不过是正则表达式的匹配方式不同,需要的函数还是写在app01的views.py文件中
#注意这一个,有分组的话需要在views.py文件的相应的函数中多加一个参数:
re_path(r'^articles/([0-9]{4})/$',views.year_archive)
#有两个分组需要在views.py的相应的函数中多加两个参数:
#注意views.py文件中形参的顺序有要求
re_path(r'^articles/([0-9]{4})/([0-9]{2})/$',views.month_archive)
#对于需要多传两个及以上参数的情况,我们可以用“有名分组”:
#在每一个分组的前面加 ?P<name> 这个name是这个分组的名字,注意不要重复
#然后在views.py文件中对应的函数里,形参的名字与这里分组的名字对应上即可,而且形参的顺序没有要求了
re_path(r'^artivles/(?P<str_2>[a-z]{2})/(?P<str_1>[a-z]{1})/$',views.str_name)
]
app01应用(package)的views.py文件中
多引入一个HttpResponse————响应对象:返回响应体,响应首行与响应头由wsgiref模块解决了
from django.shortscuts import render,HttpResponse
#所有的请求信息都在这个request中!这个形参一定要写!
def special_case_2003(request):
return HttpResponse('special_case_2003')
def year_archive(request,year):
return HttpResponse(year)
#注意这里形参的顺序有要求的
def month_archive(request,year,month):
return HttpResponse('year:'+year+'month:'+month)
#urls中利用“有名分组”的话,形参定义的顺序没有要求了,调用按照自己需要的顺序来就可以
def str_name1(request,str_1,str_2):
return HttpResponse(str_2+' '+str_1)
url高级用法
re_path(r'^index/(?P<year>\d+)/(\d+)/', views.index,{'foo':'xxxxx'})
这样写的话,后面的视图函数index必须有个参数的名字叫foo
,而且它必须在位置参数的后面!foo的值是'xxxxx'
def index(request,foo):
return HttpResponse(foo)