django (装饰器,母版继承,自定义,request对象,response对象)
1.
def wrapper(fn):
def inner(*args,**kwargs):
执行被装饰函数之前的操作
ret = fn(*args,**kwargs)
执行被装饰函数之后的操作
return ret
return inner
def yue(tools):
pass
yue = wrapper(yue)
print(yue(tools))
2. tags
1. for
{% for i in list %}
{{ i }}
{% endfor %}
{% for i in list %}
{{ i }}
{% empty %}
空的
{% endfor %}
forloop {}
forloop.counter 当前循环的索引值 索引值从1开始
forloop.counter0 当前循环的索引值 索引值从0开始
forloop.revcounter 当前循环的索引值(倒序) 索引值到1结束
forloop.revcounter0 当前循环的索引值(倒序) 索引值到0结束
forloop.first 当前循环是否是第一次 True
forloop.last 当前循环是否是最后一次
forloop.parentloop {}
2. if
{% if 条件%}
操作
{% endif %}
{% if 条件%}
操作
{% elif 条件 %}
{% else %}
{% endif %}
注意:
1. 不支持连续判断 a>b>c a>b and b>c
2. 不支持算数运算 + - * / add
3. with
{% with 变量 as 别名%}
{{ 别名 }}
{% endwith %}
4. csrf_token
1. 放在form表单中
2. 在表单中添加了一个隐藏的input标签
name csrfmiddlewaretoken
valve askjdaskdhashdkasd 64
5. 母版继承
1. 定义一个母版 普通的HTML代码 base.html
2. 在母版中定义block块
3. 子页面中继承的母版 {% extends 'base.html' %}
4. 重写block块
注意事项:
1. {% extends 'base.html' %}写在第一行
2. {% extends name %} name写继承的母版的名字字符串
3. 自定义的内容写在block中
4. 定义多个block块 一般要有js css
1. 模板
1. 组件
1. 写一段的代码 nav.html
2. {% include 'nav.html' %}
2. 静态文件相关
1. {% load static %}
2. {% static '相对路径' %} ——》 去settings中获取STATIC_URL '/static/' 和相对路径进行拼接
3. {% get_static_prefix %} ——》 去settings中获取STATIC_URL '/static/'
"{% get_static_prefix %}相对路径"
3. 自定义inclusion_tag
1. 在app下创建一个templatetags的python包 templatetags名字不能错
2. 在包下写py文件 mytags
3. 编辑文件
from django import template
register = template.Library()
4. 定义函数
可以接受参数
返回一个字典
5. 函 v数上加装饰器
@register.inclusion_tag('pagination.html')
6. 函数返回的字典 交给 pagination.html 渲染
4.自定义simpletag
和自定义filter类似,只不过接收更灵活的参数。
定义注册simple tag
@register.simple_tag(name="plus")
def plus(a, b, c):
return "{} + {} + {}".format(a, b, c)
使用自定义simple tag
{% load app01_demo %}
{% plus "1" "2" "abc" %}
2. 视图
1。 CBV 和 FBV
FBV function based view
CBV class based view
2. CBV的流程
1. 定义CBV
from django.views import View
class AddPress(View):
print('get')
print(self.request)
return render(self.request, 'add_press2.html')
print('post')
press_name = request.POST.get('name')
Press.objects.create(name=press_name)
return redirect('/press_list/')
2. 使用
url(r'^add_press/$', views.AddPress.as_view()), # 添加出版社
3. 流程
1. AddPress.as_view() —— 》 view函数
2. 当请求到来的时候执行view函数:
1. 实例化自己写的类 —— 》self
self = cls(**initkwargs)
3. 执行 self.dispatch(request, *args, **kwargs)
1. 执行父类中的dispatch方法
1. 判断请求方式是否被允许
1. 允许的情况
handler = 通过反射获取 get post 方法
2. 不允许的情况
handler = 不允许的方法
3. handler(request, *args, **kwargs)
2. 返回HttpResponse对象
4. 返回HttpResponse对象 给django
3. request
print(request.method)
print(request.GET)
print(request.POST)
print(request.FILES)
print(request.body)
print(request.scheme)
print(request.path)
print(request.encoding)
print(request.META)
请求相关的常用值
path_info 返回用户访问url,不包括域名
method 请求中使用的HTTP方法的字符串表示,全大写表示。
GET 包含所有HTTP GET参数的类字典对象
POST 包含所有HTTP POST参数的类字典对象
body 请求体,byte类型 request.POST的数据就是从body里面提取到的
属性
所有的属性应该被认为是只读的,除非另有说明。
django将请求报文中的请求行、头部信息、内容主体封装成 HttpRequest 类中的属性。
除了特殊说明的之外,其他均为只读的。
表示请求方案的字符串(通常为http或https)
这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。
接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。
如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。
因此,不应该使用 if request.POST 来检查使用的是否是POST 方法;应该使用 if request.method == "POST"
FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。
包含数据。否则,FILES 将为一个空的类似于字典的对象。
CONTENT_TYPE —— 请求的正文的MIME 类型。
HTTP_ACCEPT —— 响应可接收的Content-Type。
HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
HTTP_HOST —— 客服端发送的HTTP Host 头部。
HTTP_REFERER —— Referring 页面。
HTTP_USER_AGENT —— 客户端的user-agent 字符串。
QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
REMOTE_ADDR —— 客户端的IP 地址。
REMOTE_HOST —— 客户端的主机名。
REMOTE_USER —— 服务器认证后的用户。
REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。
SERVER_NAME —— 服务器的主机名。
SERVER_PORT —— 服务器的端口(是一个字符串)。
从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,请求中的任何 HTTP 首部转换为 META 的键时,
都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_ 前缀。
所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。
10.HttpRequest.user
# Do something for logged-in users.
else:
# Do something for anonymous users.
class models.AnonymousUser
username 永远为空字符串。
get_username() 永远返回空字符串。
is_staff 和 is_superuser 永远为False。
is_active 永远为 False。
groups 和 user_permissions 永远为空。
is_anonymous() 返回True 而不是False。
is_authenticated() 返回False 而不是True。
set_password()、check_password()、save() 和delete() 引发 NotImplementedError。
New in Django 1.8:
新增 AnonymousUser.get_username() 以更好地模拟 django.contrib.auth.models.User。
完整的细节参见会话的文档。
"""
保存上传文件前,数据需要存放在某个位置。默认当上传文件小于2.5M时,django会将上传文件的全部内容读进内存。从内存读取一次,写磁盘一次。
但当上传文件很大时,django会把上传文件写到临时文件中,然后存放到系统临时文件夹中。
:param request:
:return:
"""
if request.method == "POST":
# 从请求的FILES中获取上传文件的文件名,file为页面上type=files类型input的name属性值
filename = request.FILES["file"].name
# 在项目目录下新建一个文件
with open(filename, "wb") as f:
# 从上传的文件对象中一点一点读
for chunk in request.FILES["file"].chunks():
# 写入本地文件
f.write(chunk)
return HttpResponse("上传OK")
print(request.get_full_path())
print(request.is_secure())
print(request.is_ajax())
1.HttpRequest.get_host()
如果这两个头部没有提供相应的值,则使用SERVER_NAME 和SERVER_PORT,在PEP 3333 中有详细描述。
>>> request.get_signed_cookie('name')
'Tony'
>>> request.get_signed_cookie('name', salt='name-salt')
'Tony' # 假设在设置cookie的时候使用的是相同的salt
>>> request.get_signed_cookie('non-existing-cookie')
...
KeyError: 'non-existing-cookie' # 没有相应的键时触发异常
>>> request.get_signed_cookie('non-existing-cookie', False)
False
>>> request.get_signed_cookie('cookie-that-was-tampered-with')
...
BadSignature: ...
>>> request.get_signed_cookie('name', max_age=60)
...
SignatureExpired: Signature age 1677.3839159 > 60 seconds
>>> request.get_signed_cookie('name', False, max_age=60)
False
复制代码
你应该使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 装饰你的视图以让响应能够正确地缓存。
request.POST.getlist("hobby")
from django.shortcuts import render, HttpResponse, redirect
1. HttpResponse HttpResponse('字符串')
2. render(request,'html文件名',{}) —— 》 HTML代码
3. redirect(跳转的地址)
4.
HttpResponse(json.dumps(ret)) # Content-Type: text/html; charset=utf-8
---恢复内容结束---
django (装饰器,母版继承,自定义,request对象,response对象)的更多相关文章
- python装饰器、继承、元类、mixin,四种給类动态添加类属性和方法的方式(一)
介绍装饰器.继承.元类.mixin,四种給类动态添加类属性和方法的方式 有时候需要給类添加额外的东西,有些东西很频繁,每个类都需要,如果不想反复的复制粘贴到每个类,可以动态添加. # coding=u ...
- 【转】Django中的request与response对象
关于request与response 前面几个 Sections 介绍了关于 Django 请求(Request)处理的流程分析,我们也了解到,Django 是围绕着 Request 与 Respon ...
- python 视图 (FBV、CBV ) 、Request 和Response对象 、路由系统
一.FBV和CBV1.基于函数的view,就叫FBV(Function Based View) 示例: def add_book(request): pub_obj=models.Publisher. ...
- java web(三):ServletContext、session、ServletConfig、request、response对象
上一篇讲了Servlet: 1)什么是Servlet[servlet本身就是一种Java类,这种Java类提供了web形式的方法,只要实现了servlet接口的类,都是一种servlet资源.] 2) ...
- SpringMvc4中获取request、response对象的方法
springMVC4中获取request和response对象有以下两种简单易用的方法: 1.在control层获取 在control层中获取HttpServletRequest和HttpServle ...
- request与response对象.
request与response对象. 1. request代表请求对象 response代表的响应对象. 学习它们我们可以操作http请求与响应. 2.request,response体系结构. 在 ...
- request与response对象详述
request与response对象. 1. request代表请求对象 response代表的响应对象. 学习它们我们可以操作http请求与响应. 2.request,response体系结构. 在 ...
- 在springMVC的controller中获取request,response对象的一个方法
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttr ...
- Request和Response对象
Request 和 Response 对象起到了服务器与客户机之间的信息传递作用.Request 对象用于接收客户端浏览器提交的数据,而 Response 对象的功能则是将服务器端的数据发送到客户端浏 ...
随机推荐
- c++野(wild)指针与悬空(dangling)指针
re 1.https://www.cnblogs.com/idorax/p/6475941.html end
- [LeetCode&Python] Problem 617. Merge Two Binary Trees
Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...
- URAL - 1003:Parity (带权并查集&2-sat)
Now and then you play the following game with your friend. Your friend writes down a sequence consis ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(二)-- Web Api Demo
在上一篇里,我已经建立了一个简单的Web-Demo应用程序.这一篇将记录将此Demo程序改造成一个Web Api应用程序. 一.添加ASP.NET Core MVC包 1. 在project.json ...
- test20180922 交错的字符串
题意 分析 这个数据范围容易使人想到折半搜索. 我们将字符串分为前后两部分.如果前半部分中搜得的前缀串为{S1, S2},那么后半部分中搜得的后缀串必须为{rev(S2), rev(S1)},且为有序 ...
- python入门20180717-迭代器、生成器和协程
迭代器.生成器和协程 python中任意的对象,只要它定义了可以返回一个迭代器的__iter__方法,或者支持下标索引的_getitem_方法,那么它就是一个可迭代对象. 可迭代的对象不一定就是迭代器 ...
- Linux块设备驱动_WDS
推荐书:<Linux内核源代码情景分析> 1.字符设备驱动和使用中等待某一事件的方法①查询方式②休眠唤醒,但是这种没有超时时间③poll机制,在休眠唤醒基础上加一个超时时间④异步通知,异步 ...
- #define WIN32_LEAN_AND_MEAN 的作用
今天看了用mysql的库+vc连接数据库,结果我用mfc application向导建立一个project,然后加入#include "mysql.h"(已经设置好了环境),编译出 ...
- kettle的资源库
在kettle中的转换或者作业等资源的存储的仓库称为资源库:分为文件资源库.数据库资源库. 一个转换或者作业可以属于某个资源库或者一个单独的文件形态存在. 一.数据库资源库 1.1在mysql中创建一 ...
- 怎样在两小时内搞定 OpenStack 部署?(转)
怎样在两小时内搞定 OpenStack 部署? OpenStack的安装是一个难题,组件众多,非常麻烦.如果手工部署OpenStack,可能需要好几天,使用RDO,就是几个命令,再加一两个小时的等待. ...