初学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)

 

posted @ 2019-11-04 15:41  RainBol  阅读(172)  评论(0编辑  收藏  举报
Live2D