zoukankan      html  css  js  c++  java
  • 初学django基础05 路由系统,django的请求与返回

    django的路由系统

      路由也是从上到下解析,一旦请求的url匹配成功,后面的路由也就不匹配了

      django分为fvb和cvb方式,如果是fvb那什么也不用做,如果是cvb需在参数后面加as_view()

    #url.py文件为配置路由的文件
    from django.contrib import admin
    from django.urls import path, include, re_path
    from user.myviews import  views3
    
    urlpatterns = [ #路由写在这里面
      #path参数,django2后支持path参数,默认包装了^...$形式,加入path参数后,route里面不能加入正则表达式
      #path(route, view, kwargs=None, name=None)route路由,view视图,name关键字生成可访问的url
    path('h1', views3.view_h1), # 请求127.0.0.1:8000/h1成功访问
        # re_path(r'^h2/(w+)/(d+)/$', views3.view_h2), #请求127.0.0.1:8000/h2/a/2/成功访问,re_path表示可以使用正则表达式匹配,^正则开始,$正则结束,r表示正则转义,()表示给分组,如果加了括号,就表示在view.py函数需要多加一个形参,这里有两个所以def view_h2(request,w1,d1)
        path('h2/<str:ww>/<int:dd>/', views3.view_h2),  # 和上面的差不多
    
        # <>表示转换器,里面是视图对应的参数要一致,请求127.0.0.1:8000/h2/a/2/成功访问,和上面差不多,一个是re_path函数,一个是path
        path('h3/', views3.view_h3, {'aaa': '123', 'bbb': '456'}),  # 请求127.0.0.1:8000/h3/成功访问
    re_path(r'^h4/(?P<ww>w+)/(?P<dd>d+)/$', views3.view_h4), # 有名分组 请求127.0.0.1:8000/h4/a/2/成功访问,在分组中括号内最前面加入关键符号?P<参数名>表示这个分组指定了名字,对应views.py中需要定义关键字参数,def view_h4(request,ww=aaa,dd=33)
    path('before_h5/', include('user.urls')), # 请求分发,意思是主url中以before_h5开头的url分发到目录中user.urls的文件中,有分支的urls来处理
    #user.urls.py
    
    from django.urls import re_path
    from user.myviews import views3
    
    urlpatterns = [
        re_path(r'^after_h5/(?P<ww>w+)/(?P<dd>d+)/$', views3.view_h5),  # 127.0.0.1:8000/before_h5/after_h5/a/2/
    ]
    View Code
    
        path('h6/uid=1', views3.view_h6, name='aaa'),  # 路由映射中反向解析,name关键字
    
        re_path(r'^h7/(d+)/', views3.view_h7, name='bbb'),  # 带参数的反向解析
    
        re_path('h8/(d+)/(w+)/', views3.view_h8, name='ccc'),  # 反向解析
    
    ]
    #view3.py文件,与上面h1-h8一一对应来看
    from django.shortcuts import render
    from django.urls import reverse
    
    
    def view_h1(request):
        return render(request, 'h1.html')
    
    # def view_h2(request,arg,arg2):#参数是按照正则的一组对应一个参数
    #     print(arg,arg2)   #a 2
    #     return render(request,'h2.html')
    def view_h2(request, ww, dd):  # 参数是按照正则的一组对应一个参数
        print(ww, dd)  # a 2
        return render(request, 'h2.html')
    
    
    def view_h3(request, aaa, bbb):
        print(aaa, bbb)  # 123 456
        return render(request, 'h3.html')
    
    
    def view_h4(request, ww, dd):
        print(ww, dd)  # a 2
        return render(request, 'h4.html')
    
    
    def view_h5(request, ww, dd):
        print(ww, dd)
        return render(request, 'h5.html')
    
    
    def view_h6(request):
        url1 = reverse('aaa')  # reverse可以帮助我们直接获取到请求的url
        print(url1)
        return render(request, 'h6.html')
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h6>
    
        <h6>{% url "aaa" %}</h6>
    
    </h6>
    </body>
    </html>
    View Code

    def
    view_h7(request, id): url2 = reverse('bbb', args=(id,)) # 如果有附加参数也可以获取到 print(url2) return render(request, 'h7.html')
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
    
    </head>
    <body>
      <form method='post' action='{% url "bbb" 1 %}'>xxxx</form>
    </body>
    </html>
    View Code
    {% url 'name关键字 动态参数'%}
    def view_h8(request, id1, id2):
        url2 = reverse('ccc', args=(id1, id2), )
        print(url2)
        return render(request, 'h8.html')
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>{% url "ccc" 2 1%}</h1>
    </body>
    </html>
    View Code

     redirect

    # redirect(to, permanent=False, *args, **kwargs)
    from django.shortcuts import redirect
    
    
    def test_redirect(request):
        # 实现重定向,, permanent = True为302, False为301
        # 301与302的区别
        # 301:
        # 可以解释为我们的访问的小h站,有了新的地址,它会使用301永久性的跳转到这个地址,浏览器就会拿着这个新的地址去访问
        # 比如我们输入百度是http://www.baidu.com,其实百度是https的,服务器使用301重定向到https://www.baidu.com
        # 302:
        # 它是临时性的,比如购物的时候出现404,等待倒计时后自动跳到首页了
        # 比如你的账号过时了,跳转也是302
        return redirect('http://www.rainbol.cn', permanent=False)

    请求与返回

    def app01(request):
        # 请求
        print(request.method)  # 获取请求方式
        print(request.path)  # 获取请求路径
        print(request.get_full_path())  # 同样可获取请求路径
        print(request.POST)  # 获取post请求数据,字典格式
        print(request.GET)  # 获取get请求数据,字典格式
        print(request.body)  # 一个字符串,请求报文的主题,在处理非http形式常用,如二进制图片,xml,json等,但是如果要处理表单数据,还是推荐使用post请求
        print(request.META)  # 所有请求头信息
        print(request.FILES)  # 类似于字典的对象,包含所有的上传文件信息,只要请求为post方法,且提交form带有enctype="multipart/form-data"的情况下才有数据,其他时候都为空
        print(request.COOKIES)  # 返回字典,包含所有cookie信息
        print(request.session)  # 一个可读可写的类,表示当前会话,只有django启动会话的支持时才可用
        print(request.user)  # AUTH_USER_MODEL类型对象 ,表示当前登录的用户
        print(request.is_ajax())
    
        # 返回三种形式,最后本质一定是返回httpresponse实例对象
        return HttpResponse('hello world!')  # 返回字符串
        # return render(request, 'xxx.html')  # 返回页面
        # return redirect()  # 重定向

       render方法   ->渲染页面

    '''
    render(request, template_name, context=None, content_type=None, status=None, using=None)
    
    request: 是请求对象,
    template_name: 模板文件名称
    context: 要传递给模板文件的变量
    content_type: 文档header头中Content-Type的类型
    status: http响应码, 就是200, 301, 302, 400, 500那个
    using: 要使用的模板引擎
    '''
    from django.shortcuts import render
    
    
    def test_render(request):
        return render(request, 'test_render.html', content_type='application/xhtml+xml', status=404)
  • 相关阅读:
    shop++之language
    shop++改造之ResponseEntity的坑
    shop++改造之Filter类
    mysql关联模糊查询他表字段
    mysql一张表多个字段关联另一张表查询
    html页面导出为excel表格
    layui打印html页面转成pdf
    jQuery视频格式的验证
    jQuery图片灯箱和视频灯箱
    空间谱专题16:信号个数估计
  • 原文地址:https://www.cnblogs.com/RainBol/p/11792391.html
Copyright © 2011-2022 走看看