ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Django 反向解析 request CBV

2021-08-14 16:01:39  阅读:210  来源: 互联网

标签:views url request Django CBV urls 分组 路由


正则路径中的分组

无名分组

分组的概念:就是给某一段正则表达式用小括号括起来

无名分组按位置传参数,一一对应。

view中除去request,其他形参数量要与urls中分组数量一致。

无名分组就是将括号内匹配到的内容当作位置参数传递给后面的视图函数

urls.py:

urlpatterns = [ 
url(r'^test/([0-9]{4})', views.test)]

views.py

from django.shortcuts import HttpResponse

def index(request,year): 
    print(year) # 一个形参代表路径中一个分组的内容,按顺序匹配
    return HttpResponse('kkk')

有名分组

有名分组按关键字传参,与位置顺序无关。

views 中除了 request,其他形参的数量要与 urls 中的分组数量一致, 并且 views 中的形参名称要与 urls 中的组名对应。

(?P<组名>正则表达式)
# 有名分组相当于给正则表达式取了别名
urlpatterns = [ 
url(r'^test/([0-9]{4})', views.test)]
from django.shortcuts import HttpResponse

def index(request,year): 
    print(year) # 形参和分组名要一致
    return HttpResponse('kkk')

有名分组就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数,需要注意的是有名无名不可以混用

反向解析

随着功能的增加,路由层的 url 发生变化,就需要去更改对应的视图层和模板层的 url,非常麻烦,不便维护。

这时我们可以利用反向解析,当路由层 url 发生改变,在视图层和模板层动态反向解析出更改后的 url,免去修改的操作。

反向解析一般用在模板中的超链接及视图中的重定向。

# 在urls.py 中给路由起别名
url(r'^hub_login/', views.login, name='login2')

def login():
  return HttpResponse('login')
# 后端反向解析
	# 在views.py 导入reverse模块
  res = reverse('login2')
  print(res)
 # 可以动态获取url路径
# 前端反向解析
	<a href="{% url 'login2' %}">登录</a>
# 这时候无论路径怎么改,html页面的路径都会动态更新

有名分组无名分组反向解析

# 无名分组反向解析
url(r'^index/(\d+)/', views.index, name = 'xxx')


# 前端
{% url 'xxx' 123 %}
# 后端
reverse('xxx', args=(1,))

# 数字一般情况下放的是数据的主键值 数据的编辑和删除


# 有名分组反向解析
url(r'^index/?<year>P(\d+)/', views.index, name = 'xxx')
<a href="{% url 'xxx' 123 %}"</a>
print(reverse('xxx',kwargs={'year':123}))
# 简便写法
print(reverse('xxx',args=(123,)))

路由分发

Django 的每一个应用都可以有自己的templates文件夹、urls.py static文件夹,正是基于上述特点,能够做到分组开发。当所有url都放在一个url里面会造成冗余不好维护。利用路由分发,总路由识别当前url是属于哪个应用下的,直接分发给对应的应用去处理。

import include

url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls'))

JsonResponse对象

from dajango.http import JsonResponse
  def test(request):
      d1 = {'kk': '你懂', 'dqin': '今晚你的节目'}
      res = JsonResponse(d1, json_dumps_params={'ensure_ascii': False})
      return HttpResponse(res)
    
如果传入的不是字典还应该加上 safe=False

FBV与CBV

视图函数既可以是函数也可以是类,FBV:function base view,CBV:class base view,CBV会根据请求方式不同匹配到对应的方法执行。

from django.views import View
# CBV必须继承View
class Mylogin():
  http_methods_name = ['get', 'post'] # 这样可以限制请求方式 有限查找内部方法
  def get(self, request):
    return HttpResponse('get')
  
  def post(self, request):
    return HttpResponse('post')
  
  
# 路由书写方法
url(r'^login/', views.MyLogin.as_View())

request对象中的方法补充

request.FILES  # 可以获取到上传的文件数据
request.FILES.get('文件名')  # 可以将它取出
request.path  # 获取到对应的路由
request.get_full_path() # 获取到对应路由和后面的参数

# 上传文件必须做的两件事:
1、请求方式改成post
2、改enctype=multipart/form-data

标签:views,url,request,Django,CBV,urls,分组,路由
来源: https://www.cnblogs.com/wuzhixian/p/15140982.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有