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/ ]
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>
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>
{% 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>
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)