python框架之Django(4)-视图&路由
视图
负责接收请求和返回响应
FBV和CBV
FBV
FBV(function base views) 就是在视图里使用函数处理请求。
from django.conf.urls import url
from django.contrib import admin from test_app import views
urlpatterns = [
url(r'^test/', views.test),
]/[project name]/urls.py
from django.shortcuts import render def test(request):
if (request.method == 'POST'):
... # do something
else:
... # do something/[app name]/views.py
CBV
CBV(class base views) 就是在视图里使用类处理请求。
from django.conf.urls import url
from django.contrib import admin from test_app import views
urlpatterns = [
url(r'^test/', views.Test.as_view()),
]/[project name]/urls.py
from django.shortcuts import render
from django.views import View class Test(View):
def get(self, request):
... # do something def post(self, request):
... # do something/[app name]/views.py
request
1. request.method # 获取请求的方法(GET、POST等)
2. request.GET # 通常用来获取URL里面的参数
3. request.POST # 用来获取POST提交过来的数据
4. request.path_info # 获取用户请求的路径(不包含IP和端口和URL参数)
5. request.body # 获取请求正文
response
1. HttpResponse # 返回字符串内容
2. render # 渲染并返回html页面
3. redirect # 返回一个重定向
4. JsonResponse # 将对象序列化成Json格式字符串并返回
路由
格式
from django.conf.urls import url urlpatterns = [
url([正则], [视图函数],[参数],name=[别名]),
] # 注意:Django 2.0中有所不同,如下:
from django.urls import path urlpatterns = [
path([正则], [视图函数],[参数],name=[别名]),
]
分组匹配
位置匹配
from django.conf.urls import url from test_app import views
urlpatterns = [
url(r'^test/([a-zA-z]+)/([0-9]{1,2})', views.Test.as_view()),
]/[project name]/urls.py
from django.shortcuts import render, HttpResponse
from django.views import View class Test(View):
def get(self, request, name, age):
resp_str = '姓名:{} 年龄:{}'.format(name,age)
return HttpResponse(resp_str)/[app name]/views.py
result
命名匹配
from django.conf.urls import url from test_app import views
urlpatterns = [
url(r'^test/(?P<name>[a-zA-z]+)/(?P<age>[0-9]{1,2})/', views.Test.as_view()),
]/[project name]/urls.py
from django.shortcuts import render, HttpResponse
from django.views import View class Test(View):
def get(self, request, age, name):
resp_str = '姓名:{} 年龄:{}'.format(name,age)
return HttpResponse(resp_str)/[app name]/views.py
result
include
可以让路由信息保存在多个文件中
from django.conf.urls import url,include urlpatterns = [
url(r'^test_app/',include('test_app.urls'))
]
/[project name]/urls.py
from django.conf.urls import url, include from . import views urlpatterns = [
url(r'^test', views.Test.as_view())
]
/[app name]/urls.py
上述配置对应的地址就是: http://localhost:8000/test_app/test
URL命名&反向解析
from django.conf.urls import url
from test_app import views urlpatterns = [
url(r'^test/([a-zA-Z]+)/([0-9]{1,2})', views.Test.as_view(), name='test_name')
]
/[project name]/urls.py
from django.shortcuts import render
from django.views import View
from django.urls import reverse class Test(View):
def get(self, request, name, age):
request_url = reverse('test_name',args=(name,age))
reverse_url = reverse('test_name',args=('zhangsan',20))
return render(request, 'test.html', {'request_url':request_url,'reverse_url': reverse_url})
/[app name]/views.py
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
请求的URL:
<br>
{{ request_url }}
<hr>
视图中解析:<br>
{{ reverse_url }}
<hr>
模板中解析:<br>
{% url 'test_name' 'zhangsan' 19 %}
</body>
</html>
/templates/test.html
![](https://img2018.cnblogs.com/blog/1133411/201809/1133411-20180927164917268-881498771.png)
result
补充
APPEND_SLASH
settings.py配置文件中默认没有 APPEND_SLASH这个项,但Django默认这个参数为 APPEND_SLASH = True。 作用就是自动在网址结尾加'/'。(测试不生效注意清理历史缓存)
给视图传递额外参数
from django.conf.urls import url
from test_app import views urlpatterns = [
url(r'^test/([a-zA-Z]+)/([0-9]{1,2})', views.Test.as_view(), {'sex': 'male'})
]
/[project name]/urls.py
from django.shortcuts import render, HttpResponse
from django.views import View class Test(View):
def get(self, request, age, name,sex):
resp_str = '姓名:{} 年龄:{} 性别:{}'.format(name,age,sex)
return HttpResponse(resp_str)
/[app name]/views.py
![](https://img2018.cnblogs.com/blog/1133411/201809/1133411-20180927161340258-1876451743.png)
result
路由中的namespace
用于区分多个app中name相同的url
from django.conf.urls import url, include
from test_app import views urlpatterns = [
url(r'^test/',views.Test.as_view()),
url(r'^test_app1/', include('test_app1.urls', namespace='app1')),
url(r'^test_app2/', include('test_app2.urls', namespace='app2')),
]
/django_test/urls.py
from django.shortcuts import render
from django.views import View
from django.urls import reverse class Test(View):
def get(self, request):
app1_url = reverse('app1:same_name', args=('zhangsan', 19))
app2_url = reverse('app2:same_name', args=('lisi', 20))
return render(request, 'test.html', {'app1_url': app1_url, 'app2_url': app2_url})
/test_app/views.py
from django.conf.urls import url, include from . import views urlpatterns = [
url(r'^test/([a-zA-Z]+)/([0-9]{1,2})', views.Test.as_view(), name='same_name')
]
/test_app1/urls.py
from django.conf.urls import url, include from . import views urlpatterns = [
url(r'^test/([a-zA-Z]+)/([0-9]{1,2})', views.Test.as_view(), name='same_name')
]
/test_app2/urls.py
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
视图中使用
<br>
{{ app1_url }}
<br>
{{ app2_url }}
<hr>
模板中使用
<br>
{% url 'app1:same_name' 'zhangsan' 19%}
<br>
{% url 'app2:same_name' 'lisi' 20 %}
</body>
</html>
/templates/test.html
![](https://img2018.cnblogs.com/blog/1133411/201809/1133411-20180927172229624-1581153411.png)
result
路由分发
路由可以以以下格式多级分发:
from django.conf.urls import url
from img_upload import views urlpatterns = [
url(r'^user/', [(
url(r'^add/', views.add), # host:port/user/add/
url(r'^list/', views.list) # host:port/user/list/
), None, None]),
]
/django_test/urls.py
python框架之Django(4)-视图&路由的更多相关文章
- python框架之django
python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django temple django models ...
- 第六篇:web之python框架之django
python框架之django python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django te ...
- Python框架之Django学习
当前标签: Django Python框架之Django学习笔记(十四) 尛鱼 2014-10-12 13:55 阅读:173 评论:0 Python框架之Django学习笔记(十三) 尛 ...
- Python框架之Django的相册组件
Python框架之Django的相册组件 恩,没错,又是Django,虽然学习笔记已经结贴,但是学习笔记里都是基础的,Django的东西不管怎么说还是很多的,要学习的东西自然不会仅仅用十几篇博文就能学 ...
- Python框架下django 的并发和多线程
django 的并发能力真的是令人担忧,django本身框架下只有一个线程在处理请求,任何一个请求阻塞,就会影响另一个情感求的响应,尤其是涉及到IO操作时,基于框架下开发的视图的响应并没有对应的开启多 ...
- Python框架之Django学习笔记(十一)
话说上次说到数据库的基本访问,而数据库我们主要进行的操作就是CRUD,也即是做计算处理时的增加(Create).读取(Retrieve)(重新得到数据).更新(Update)和删除(Delete),俗 ...
- python框架之Django(12)-认证系统之auth模块
我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Django作为一个完美主义者的终极框 ...
- python框架之Django(13)-admin组件
使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTALLED_APPS ...
- python框架之Django(14)-rest_framework模块
APIView django原生View post请求 from django.shortcuts import render, HttpResponse from django import vie ...
随机推荐
- PEP 492 -- Coroutines with async and await syntax 翻译
因为工作中慢慢开始用python的协程,所以想更好的理解一下实现方式,故翻译此文 原文中把词汇表放到最后,但是我个人觉得放在最开始比较好,这样可以增加当你看原文时的理解程度 词汇表 原生协程函数 Na ...
- Sublime Text 代码块注释
插件:DocBlockr /*回车:创建一个代码块注释 /**回车:在自动查找函数中的形参等等.
- Mysql 索引问题-日期索引使用
这两天发现原来的查询效率慢了,使用explain 查看,居然没有使用索引,我的索引是日期类型的,首先想到的是mysql对日期类型的索引的处理机制是不是不同,在where条件里试了几种,发现效果都差不多 ...
- vim粘贴和保存
- 怎么让Windows2012和Windows2008多用户同时远程
具体方法请参照百度经验:http://jingyan.baidu.com/article/cd4c2979f19765756e6e60ec.html.经过实践证明,是没有问题的.
- Hbase:原理和设计
转载自:http://www.sysdb.cn/index.php/2016/01/10/hbase_principle/ ,感谢原作者. 简介 HBase —— Hadoop Database的简称 ...
- MySQL命令学习
上面两篇博客讲了MySQL的安装.登录,密码重置,为接下来的MySQL命令学习做好了准备,现在开启MySQL命令学习之旅吧. 首先打开CMD,输入命令:mysql -u root -p 登录MySQ ...
- 浅谈一下Windows下的用户权限
大学毕业后,选择做了苹果开发,一直是使用的Mac系统,所以对Windows的基本操作忘得几乎一干二净:因为做内网穿透的需要,要用到Windows下的权限问题,所以重新研究了一下Windows设置用户权 ...
- array_walk 与 array_map的 区别
1.array_walk是用于用户自定义的函数,所以想用array_walk($aIds, "trim");去掉数据元素中的空格是达不到目的的只能用array_walk($aIds ...
- Tensorflow一些常用基本概念与函数
1.tensorflow的基本运作 为了快速的熟悉TensorFlow编程,下面从一段简单的代码开始: import tensorflow as tf #定义‘符号’变量,也称为占位符 a = tf. ...