Django URL(路由系统)
一、语法
urlpatterns = [
path(正则表达式,views视图函数,参数,别名),
]
参数说明:
1.一个正则表达式字符串
2.一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
3.可选的要传递给视图函数的默认参数(字典形式)
4.一个可选的name参数
例如:
urlpatterns = [
path('admin/',admin.site.urls), #默认的
path('blog/',views.blog),
]
二、正则字符串参数
urlpatterns = [
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中捕获一个值,只需要在它周围放置一对圆括号
不需要添加一个前导的反斜杠,因为每个URL都有。例如,应该是 ^ articles而不是 ^ / articles。
每个正则表达式前面的'r'是可选的但是建议加上
设置是否开启URL访问地址后面不为/跳转至带有/的路径
APPEND_SLASH=True
三、有名分组(named group)
在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]
注:\d代表数字
{4}说明重复四次
?P有名分组
<year>真正的名字
###实例:
url 文件
urlpatterns = [
path('admin/', admin.site.urls),
#无名分组
path('article1/\d{4}', views.article_year0), #得到固定的
path('article2/(\d{4})',views.article_year), #输入什么得到什么
path('article3/(\d{4})/(\d{2})',views.article_year_month),
path('article4/(\d{4})/(\d{2})/(\d{2})',views.article_year_month_day),
#有名分组
url(r'article5/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})',views.article_year_month_day),
path('register/',views.register,name="reg"), #reg是别名
]
###views文件
#输出固定的2004
def article_year0(request):
return HttpResponse("2004")
#根据输入来输出
def article_year(request,year): #year就是url里面的参数
return HttpResponse(year)
def article_year_month(request,year,month):
return HttpResponse("year:%s month:%s"%(year,month))
def article_year_month_day(request,year,month,day):
return HttpResponse("year:%s month:%s day:%s"%(year,month,day))
##别名的使用
urlpatterns = [
path('register/',views.register,name="reg"), #reg是别名
]
##views文件
def register(request):
if request.method == "POST":
print(request.POST.get("user"))
print(request.POST.get("age"))
print(request.POST.get("hobby"))
user = request.POST.get("user")
if user == "kang":
return redirect('/login/') #跳转到页面login
return HttpResponse("success!")
return render(request,"register.html")
##html文件
<h1>学生注册</h1>
<hr>
<form action="{% url "reg" %}" method="post">
<p>姓名<label>
<input type="text" name="user">
</label></p>
<p>年龄<label>
<input type="text" name="age">
</label></p>
<p>爱好<label>
<input type="checkbox" name="hobby" value="篮球">
</label>篮球
<label>
<input type="checkbox" name="hobby" value="足球">
</label>足球
<label>
<input type="checkbox" name="hobby" value="乒乓球">
</label>乒乓球
</p>
<p><input type="submit">提交</p>
</form>
四、路由分发
urls文件配置
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('app/',include('app.urls')),
]
然后在APP下面建立urls.py文件,在这个里面写APP下的url