<玩转Django2.0>读书笔记:URL规则和视图
1. 带变量的URL
#urls.py
from django.urls import path
from .view import *
urlpatterns = [
path('',index_views),
#添加带有整数的字符类型、整形和slug的URL
path('<year>/<int:month>/<slug>',mydate_views),
]
URL变量类型:
- 字符类型 : 默认类型,匹配任何非空字符串,但不含'/'
- int : 整型
- slug : 可理解为注释、后缀或附属等概念
- uuid : 匹配一个uuid格式对象.为防止冲突,规定必须使用破折号并且所有字母小写
from django.urls import re_path
from .views import *
urlpatterns = [
path('',index_views),
re_path('test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})',mydate_views),
]
使用正则表达式写法:
- ?P 是固定格式
- 为变量的编写规则
- [0-9]{4} 是正则表达式
2. 响应类型
视图函数return的响应类型
| 响应类型 | 说明 |
|---|---|
| HttpResponse('Hello World') | HTTP状态码200,请求已成功被服务器接收 |
| HttpResponseRedirect('/admin/') | HTTP状态码302,重定向Admin站点的URL |
| HttpResponsePermanentRedirect('/admin/') | HTTP状态码301,永久重定向Admin站点的URL |
| HttpResponseBadRequest('BadRequest') | HTTP状态码400,访问的页面不存在或者请求错误 |
| HttpResponseNotFound('NotFound') | HTTP状态码404,网页不存在或网页的URL失效 |
| HttpResponseForbidden('NotFound') | HTTP状态码403,没有访问权限 |
| HttpResponseNotAllowed('NotAllowed') | HTTP状态码405,不允许使用该请求方式 |
| HttpResponseServerError('ServerError') | HTTP状态码500,服务器内容错误 |
响应类型代表HTTP状态码,其核心作用是Web Server服务器用来告诉客户端当前网页请求发生了事,或者当前Web服务器的响应状态
3. 文件下载
def download_views(request):
# 定义HttpResponse的响应类型为文件(text/csv),生成resp对象
resp = HttpResponse(content_type="text/csv")
# attachment设置文件下载方式,filename为文件名
resp['Content-Disposition'] = 'attachment;filename="somefilename.csv"'
# 使用csv模块加载resp对象,把数据写入resp对象所设置的csv文件
writer = csv.writer(resp)
writer.writerow(['First row','A','B','C'])
return resp
也可以使用StreamingHttpResponse和FileResponse实现下载,推荐使用FileResponse
def download_views2(request):
file = open('/home/tarena/简言.jpg','rb')
resp = FileResponse(file)
resp['Content-Type']='image/jpeg'
resp['Content-Disposition'] = 'attachment;filename="简言.jpg"'
return resp
关于文件下载类型,参考地址:
http://tool.oschina.net/commons
4. render(),redirect()函数
Django在django.http模块上进行封装.从而有了render(),redirect()函数
render()函数参数:
- request : 浏览器向服务器发送的请求对象,必须参数
- template_name : HTML模板文件名,用于生成HTML网页,必须参数
- context : 对HTML模板变量赋值,以字典格式表示,默认为空字典
- status : HTTP状态码,默认为200
- using : 设置HTML模板转换成HTML网页的模板引擎
5. request常用属性
| 属性 | 说明 | 实例 |
|---|---|---|
| COOKIES | 获取客户端Cookie信息 | data = request.COOKIES |
| FILES | 字典对象,包含所有的上传文件.该字典有三个键:filename为上传文件名;content-type为上传文件的类型;content为上传文件内容 | file = request.FILES |
| GET | 获取GET请求的请求参数,以字典形式存储 | request.GET.get('name') |
| META | 获取客户端的请求头信息,以字典形式存储 | request.META.get('REMOTE_ADDR') #获取客户端的IP地址 |
| method | 获取该请求的请求方式(GET或POST) | data = request.method |
| path | 获取当前请求的URL地址 | path = request.path |
| user | 获取当前请求的用户信息 | name = request.user.username |
6. 通用视图
Django植入了通用视图这一功能,该功能封装了视图开发常用的代码和模式
通用视图通过定义和声明类的形式实现的,根据用途划分为三大类:
- TemplateView 直接返回HTML模板,但无法将数据库的数据展示出来
- ListView 将数据库的数据传递给HTML,通常获取某个表的所有数据
- DetailView 将数据库的数据传递给HTML模板,通常获取数据表的单条数据
# urls.py
...
path('index/',ProductList.as_view())
...
# views.py
from django.views.generic import ListView
# 通用视图
class ProductList(ListView):
# 设置HTML模板的变量名称
context_object_name = "type_list"
# 设定HTML模板
template_name = "index.html"
# 查询数据
queryset = Product.objects.values('ttype').distinct()
# 重写 get_queryset 方法,对模型 Product 进行数据筛选
# def get_queryset(self):
# type_list = Product.objects.values('ttype').distinct()
# return type_list
# 添加其他变量
def get_context_data(self,**kwargs):
context = super().get_context_data(**kwargs)
context['name_list'] = Product.objects.values('name','ttype')
return context
通用视图还可以获取URL的参数和请求信息
# urls.py
...
path('index/<id>',ProductList.as_view(),{"name":"小米9"})
...
...
def get_queryset(self):
# 获取URL的变量id
print(self.kwargs['id'])
# 获取URL参数name
print(self.kwargs['name'])
# 获取请求方式
print(self.request.method)
type_list = Product.objects.values('ttype').distinct()
return type_list
...
<玩转Django2.0>读书笔记:URL规则和视图的更多相关文章
- <玩转Django2.0>读书笔记:模板和模型
1. 模板内置标签 Django常用内置标签 标签 描述 {% for %} 遍历输出变量的内容 {% if %} 对变量进行条件判断 {% csrf_token %} 生成csrf_token标签, ...
- <玩转Django2.0>读书笔记:表单
1. 表单字段 参考: 官方文档 Django表单字段汇总 2. 表单代码示例(forms.Form) # form.py代码 # 获取数据库数据 choices_list = [(i+1,v['ty ...
- <玩转Django2.0>读书笔记:邮件和分页
1. 发送邮件 # settings.py设置 # 邮箱设置 EMAIL_USE_SSL = True # 邮件服务器 EMAIL_HOST = 'smtp.qq.com' # 邮件服务端口 EMAI ...
- 《玩转Django2.0》读书笔记-编写URL规则
<玩转Django2.0>读书笔记-编写URL规则 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. URL(Uniform Resource Locator,统一资源定位 ...
- 《玩转Django2.0》读书笔记-Django建站基础
<玩转Django2.0>读书笔记-Django建站基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.网站的定义及组成 网站(Website)是指在因特网上根据一 ...
- 《玩转Django2.0》读书笔记-探究视图
<玩转Django2.0>读书笔记-探究视图 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 视图(View)是Django的MTV架构模式的V部分,主要负责处理用户请求 ...
- 《玩转Django2.0》读书笔记-Django配置信息
<玩转Django2.0>读书笔记-Django配置信息 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 项目配置是根据实际开发需求从而对整个Web框架编写相应配置信息. ...
- Django2.0中得url路由path得用法
Django2.0中,url得匹配规则更新了,在django1.0中,url是用正则表达式书写得,相对来说比较繁琐一些,在django2.0中进行了升级优化,改为了path from django.u ...
- 玩转 Django2.0 笔记1
模板静态 路由 urls.py urlpatterns = [ path("<year>/<int:month>/<slug:day>",my ...
随机推荐
- Java调用第三方http接口的方式
1. 概述 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适.很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信.天气等). 在J ...
- JSP和后台交互时的乱码问题
在Servlet或者是拦截器里面添加下面的语句: request.setCharacterEncoding("utf-8"); response.setCharacterEncod ...
- JS中JSON和string字符串相互转换
在Firefox,chrome,opera,safari,ie9,ie8等高级浏览器直接可以用JSON对象的stringify()和parse()方法. JSON.stringify(obj)将JSO ...
- [置顶]Python开发之路
阅读目录 第一篇:python入门 第二篇:数据类型.字符编码.文件处理 第三篇:函数 第四篇:模块与包 第五篇:常用模块 第六篇:面向对象 第七篇:面向对象高级 第八篇:异常处理 第九篇:网络编 ...
- sleep、wait、notify、notifyAll的区别
Sleep 和wait 1. sleep是Thread类的静态方法,wait是Object类中定义的方法2. Thread.sleep不会导致锁行为的改变,如果当前线程是拥有锁的,那么Thread.s ...
- Luogu P4204 神奇口袋 题解报告
题目传送门 [题目大意] 一个口袋里装了t种颜色的球,第i种颜色的球的数目为a[i],每次随机抽一个小球,然后再放d个这种颜色的小球进口袋. 给出n个要求,第x个抽出的球颜色为y,求满足条件的概率. ...
- UTF-8字符C2A0引起的问题
今天遇到一个问题: 网页上的一段文字中有几个空格,把这段文字当作文件名称保存为一个windows系统下的文件后,文件名中本来是空格的地方变成了问号,另外一个C#程序打开这个文件,也提示找不到文件. 初 ...
- 论文笔记:Fast(er) RCNN
在 RCNN 初步试水取得成功后,研究人员又迅速跟进,针对 RCNN 中的几点不足提出改进,接连推出了 fast-rcnn 和 faster-rcnn.关于这两篇论文,网上相关的文章实在是多如牛毛,因 ...
- 网络流板子/费用流板子 2018南京I题+2016青岛G题
2018南京I题: dinic,链式前向星,数组队列,当前弧优化,不memset全部数组,抛弃满流点,bfs只找一条增广路,每次多路增广 #include <bits/stdc++.h> ...
- 在虚拟机里连接PLC S7-200
1-使用PPI线连接 这次选择了在虚拟机里面来调试PLC,s7-200的型号是214-2AD23-0XB8 ,连接线是在淘宝上卖的(连接),在虚拟机里面试的时候没有反应,如下 在设备管理器里面观察,在 ...