欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

2019-02-16 URL 解析、重定向和模板

最编程 2024-04-02 16:41:17
...

url结构:
例子:http://www.baidu.com:8080/news/index.html?id=1111%page=12#name
协议// 域名(ip):端口/ 路径 ? 参数 #锚点
1.url:
网址 全网统一资源定位符
格式
2.django 的路由系统
当一个请求来到时
1.首先到项目目录下的urls.py(根URlconf模块)中,查找路由规则
2.根URlconf模块,里面定义了 urlpatterns变量
3.urlpatterns 是一个(django.url.path 或 django.urls.re_path对象 )列表
4.按顺序运行每个url模式,在第一个匹配的模式停止
5.一旦匹配,djangon导入并调用给定的视图
6.如果中间出错,或者没有匹配到,返回404

-path对象
path(route,view,kwargs=None,name=None)
router参数: 一个字符串的urlf规则  
    可以传参数 
    例: path('index/<参数1>-<参数2>',view)  #传递了 参数1,参数2 用 -间隔, 可以用其他符号
        path('index/<pk>-<date>',view1)  url:   http://0:8000/index/1-201801 
        path('index/<pk>/<date>',view1)  url:   http://0:8000/index/1/201801 
    
    在视图中 定义  def index(request,pk,date):  # 必填参数
                        return HttpResponse('lalallalala %s%s' %(pk, date))
-在url中捕获参数
    在url规则中使用<变量名>可以捕获url中的值
    传递给视图
    **默认捕获值是 str 字符串
    path('index/<int:pk>',view1)  # 定义参数的数值类型
    1.str 匹配了'/'路径分割符之外的所有字符
    
    2.int  匹配任意整型   ,会转换成 int 类型
    http://192.168.3.20:8000/detail/12/
    参数值为:12
    3.slug 匹配任意ascll字符 加上连字符和下划线
    
    4.uuid 格式化id
    http://192.168.3.20:8000/uuider/9b1deee5-4035-4398-b5f9-54ba28c94566/
    参数值为:9b1deee5-4035-4398-b5f9-54ba28c94566/
    5.path 匹配任意非空字符
    http://192.168.3.20:8000/pather/a/b/c/
    参数值为:a/b/c/
    
-使用正则表达式re_path()
    re_path(r'student/(\d{4})/([0][1-9]|1[0-2])/', views.student)
    http://192.168.3.20:8000/student/2018/09/
    re_path(r'student/(?P<year>\d{4})/(?P<month>[0][1-9]|1[0-2])/', views.student)
      ?P<year> ?P<month> 指定变量
    python 中正则表达式的分组命名 (?P<name>正则表达式)

- django 搜索url 搜索什么?
    只搜索url的路径部分,  跟 参数 以及请求方法 无关
    同一个url 可以匹配 get  post
    

    
-传递额外参数kwargs
    kwargs 字典类型
        path('detail/<int:pk>/', views.detail, kwargs={'pk':20}) 
        额外参数和 路径中捕获的参数 同名时, 覆盖路径中的参数
        path('detail/<int:pk>/', include('teatch'), kwargs={'pk':20})
            下级url组中teatch下url都 将带上 这个额外参数
            
    
-包含其他 URLconfs
    include
    根urls
    urlpatterns =[
        path('teatch/',include('teacher.urls'))    导入子app 'teacher'下的urls
        path('teatch/<参数>',include('teacher.urls'))    导入子app 'teacher'下的urls
    ]
       上级路径中的参数和额外参数 会传到下级路径 对象中去.
    子app urlpatterns
    1.views 应该写在app的目录中
        app的urls 
        http://192.168.3.20:8000/teacher/detail/2018/09/)
        子app中下级路径
        
-重定向 
    
    view 中 
    from django.shortcuts import render, redirect ,reverse
    # 导入 render渲染(作用把对象变成 文本, 用于返回给服务器)   
    # redirect重定向
    # reverse 解析path对象的 name
    例: path('index/',views.index,name='index')
        path('news/',views.news,name='news')
    在view 中
        def index(request):
            url = reverse('path对象名')   #返回 url  
            return redirect(url)
            
    path(name='index') 作用 路径不管怎么改都不影响 url 功能        
    
    -app_name =app名称
        定义在app文件夹下的urlconf模块中
        
    reverse('student:index')     student为 app_name; 多个app都可以有 name名为index 的path对象名
    
2.模板系统
    html 源码写到模板文件中
    -模板路径设置
    项目目录下的settings.TEMPLATES
    BACKEND:模板引擎
    DIRS:模板路径  (一般模板放在项目根目录下.)
      DIRS: [os.path.join(BASE_DIR, 'templates')] #项目根目录下的templates目录
        
    在视图文件中
    from django.template.loader import get_template
    
    def index(request):
    #如果模板文件index.html 在项目根目录\templates\teacher\index.html
        tp = get_template('teacher/index.html') #直接写templates之后的路径/index.html,之前的 已经在setting中设置
        html = tp.render()  # 渲染 成 str字符串
        return HttpResponse(html)
    #return render(request,'teacher/index.html') 代替上的3句(快捷方式)   

推荐阅读