Django 反向解析 request CBV
正则路径中的分组
无名分组
分组的概念:就是给某一段正则表达式用小括号括起来
无名分组按位置传参数,一一对应。
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
Django 反向解析 request CBV的更多相关文章
- django反向解析URL和URL命名空间
django反向解析URL和URL命名空间 首先明确几个概念: 1.在html页面上的内容特别是向用户展示的url地址,比如常见的超链接,图片链接等,最好能动态生成,而不要固定. 2.一个django ...
- Django 反向解析
#1,定义: #随着功能的增加会出现更多的视图,可能之前配置的正则表达式不够准确,于是就要修改正则表达式,但是正则表达式一旦修改了,之前所有对应的超链接都要修改,真是一件麻烦的事情,而且可能还会漏掉一 ...
- Django反向解析与分组命名
1.图书管理系统中使用分组或命名分组.URL的命名和反向解析: 2.删除功能三合一: urls.py文件 from app_book import views urlpatterns = [ url( ...
- django反向解析和正向解析
Django的正向解析和反向解析 先创建一个视图界面 urls.py index.html index页面加载的效果 正向解析 test/?result=1 所谓正向解析就是直接在这里写地址 向url ...
- django反向解析传参
这两天写代码总是有反向解析传参顺带复习了一下反向解析,以下是简单的反向解析 以下是我最近写的很多的反向解析传参 想要实现点击修改将这些从数据库读取的内容传到另一个页面就要通过id来查询,那么我们就需 ...
- django之路由分组,反向解析,有名,无名分组
路由层 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态的概念 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'test',vi ...
- Web框架之Django_03 路由层了解(路有层 无名分组、有名分组、反向解析、路由分发 视图层 JsonResponse,FBV、CBV、文件上传)
摘要: 路由层 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态网页.虚拟环境 视图层 JsonResponse FBV 与 CBV(function base views与class bas ...
- Django之路由分发和反向解析
一.路由分发: 路由分发是指:总路由不再直接做路由与视图函数的对应关系,而是将获取的路由分发给下面的app去处理对应关系 from django.conf.urls import url,includ ...
- Django3 Django 路由分发,反向解析,2.0版本的path
urls配置像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行. 1.简 ...
随机推荐
- 安卓开发--探究碎片Fragment
简述: 最近做开发的时候又遇到了Fragment,发现太久没写,都快忘了,就抓紧写个笔记(我太懒的了233) Fragment可以简单的看成迷你的活动,它和活动一样都有布局和生命周期,它可以嵌入活动之 ...
- Spring常见异常说明
文章要点 Spring bean 的声明方式 Spring bean 的注入规则 Spring bean 的依赖查找规则 Spring bean 的名称定义方式和默认名称规则 XXX required ...
- java基础---数组的排序算法(3)
一.排序的基本概念 排序:将一个数据元素集合或序列重新排列成按一个数据元素某个数据项值有序的序列 稳定排序:排序前和排序后相同元素的位置关系与初始序列位置一致(针对重复元素来说,相对位置不变) 不稳定 ...
- 求数组的子数组之和的最大值III(循环数组)
新的要求:一维数组改成循环数组,只是涉及简单算法,只是拿了小数做测试 想法:从文件读取数组,然后新建数组,将文件读取的数组在新数组中做一下连接,成为二倍长度的数组,然后再遍历,将每次遍历的子数组的和存 ...
- JavaScript学习笔记:你必须要懂的原生JS(二)
11.如何正确地判断this?箭头函数的this是什么? this是 JavaScript 语言的一个关键字.它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用. this的绑定规则 ...
- Java成长之路--一个非科班生的进阶之路
前言 笔者从事Java开发六年有余,从什么都不懂的小白一路成长到上市公司管理20人的技术leader.管理的团队,虽然人数不算多,但也是对于我这个非科班生这么多年努力的一种肯定.在技术的道路上,我没有 ...
- 微信小程序云开发-云存储-上传文件(word/excel/ppt/pdf)到云存储
说明 word/excel/ppt/pdf是从客户端会话选择文件.使用chooseMessageFile中选择文件. 一.wxml文件 上传按钮,绑定chooseFile <!--上传文件(wo ...
- 去掉返回的json中特殊字符
private static String jsonString(String s) { char[] temp = s.toCharArray(); int n = temp.length; for ...
- java中的集合类学习(三)
JAVA中有许多的集合,常用的有List,Set,Queue,Map. 1.其中List,Set,Queue都是Collection(集合),其每个元素都是单独的一个对象,如List<Strin ...
- Python基础之PyQt5关闭界面
想让执行完程序后自动关闭窗口,而不用点击右上角叉叉的方法是self.close(),具体应用还是以treewidget为例. 前面我们写了一个treewidget的界面,并且实现了界面代码分离,具体实 ...