A-2 django的url规则

当一个请求到达

  首先到项目根目录下的urls.py查找路由规则

  按顺序匹配url

  一旦匹配,django导入并调用给定的视图

  如果没有匹配到或者出错,返回404

path(route,view,kwargs=None,name=None)

  route:字符串url规则

  view:视图

  kwargs:额外参数,传递给view,必须是一个字典

  nameurl的命名 一般配合需要返回到一个视图所对应的url时用到

url捕获参数

1.在视图中定义detail方法,并定义pk参数

def detail(request,pk):     
    return HttpResponse("捕获的参数为 %s" % pk)

2.urls.py中配置需要捕获参数的url

urlpatterns = [     
    #使用<>指定需要获取参数名     
    # 与方法中的参数名一致    
     path('detali/<pk>/',views.detail()) ]

3.访问urlhttp://127.0.0.1:8000/detali/45/

页面显示:捕获的参数为 45

路径转换器

  常用的类型转换器

  str:匹配除 / 之外的所有字符串

  int:匹配任意整数

  slug:匹配任意ascii字符,加上连字符和下划线

  uuid:格式id

  path:匹配任意非空字符

  urlpatterns = [    #将传递的参数转换为int类型    #如何传递的参数不能转换为int类型就会报错    

  path('detali/<int:pk>/',views.detail) ]

正则表达式re_path

1在视图中定义students方法,并调用年、月参数

def students(request,year,month):     
    return HttpResponse("%s年%s月" %(year,month))

2.使用re_path定义url路径

urlpatterns = [    
#使用正则表达式对传递的参数进行过滤    
re_path(r'students/(?P<year>\d{4})/(?P<month>[0-9]|1[0-2])/',    views.students) 
]

Django搜索url

1.只搜索路径部分,跟参数,以及请求方法(getpost)无关

2.同一个url可以匹配getpost

传递额外参数

1.在视图中定义方法

def detail(request,pk,status):    
 return HttpResponse("捕获的参数为 %s" % pk)

2.配置url

urlpatterns = [
    #kwargs必须是字典
    #kwargs中的status在detail方法中存在
    #如果传递的参数名和kwargs中的键一致,以kwargs为准
    path('detail/<int:pk>/',views.detail,kwargs={"status":True})
]

include

1.include,一个urls.py中引用另一个urls.py

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    #项目目录中的urls.py引用teacher中的urls.py
    path('teacher/',include('teacher.urls'))
]

url命名

1.在urls.py定义app_name

2.指定url name

from django.urls import path,re_path
from . import views
app_name = "teacher"
urlpatterns = [
    path('index/',views.index),
    path('login/',views.login,name="login"),
]

3.index重定向到login

from django.shortcuts import reverse,redirect
from django.http import HttpResponse
def index(request):
    url = reverse("teacher:login")  #appname:urlname
    return redirect(url)
def login(request):
    return HttpResponse("登录页面")

 

posted @ 2019-03-15 22:13  眨眼  阅读(557)  评论(0)    收藏  举报