模板语言
* {{ item }}
* {% for item in item_list %} <a>{{ item }}</a> {% endfor %}
forloop.counter
forloop.first
forloop.last
* {% if ordered_warranty %} {% else %} {% endif %}
* 母板:{% block title %}{% endblock %}
* 子板:{% extends "base.html" %}
{% block title %}{% endblock %}
* 组件:{% include "pub.html" %}
* 帮助方法:
{{ item.event_start|date:"Y-m-d H:i:s"}}
{{ bio|truncatewords:"30" }}
{{ my_list|first|upper }}
{{ name|lower }}
自定义simple_tag函数
1.在app01中创建templatetags目录(路径和名字不能变)
2.在目录下创建xx.py文件
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.simple_tag
def my_simple_time(v1,v2,v3):
return v1 + v2 + v3
@register.simple_tag
def my_input(id,arg):
result = "<input type='text' id='%s' class='%s' /> " %(id,arg,)
return mark_safe(result)
3.在html文件中导入xx.py
{% load xx %}
4.使用函数
{% my_func name "aa" "bb" "cc" %}
5.在settings中注册app01
cookie
def login(request):
if request.method == "GET":
return render(request, "login.html",{})
else:
user = request.POST.get("user")
pwd = request.POST.get("password")
if user=="alex" and pwd=="123":
# ------------设置cookies--------------
obj = redirect("/student/")
# obj.set_cookie("ticket","alex123",path="/student/",max_age=10)
obj.set_signed_cookie("k1","alex1234",max_age=10,salt="runtun")
return obj
else:
return render(request,"login.html")
设置cookies
# 在views函数返回值中设置
obj = redirect("/student/")
obj.set_cookie("ticket","alex123",path="/student/",max_age=10)
rep.set_signed_cookie(key,value,salt='加密盐',...)
return obj
# 参数:
key, 键
value='', 值
max_age=None, 超时时间
expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
path='/', Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
domain=None, Cookie生效的域名,默认当前路径
secure=False, https传输
httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
获取cookie
request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
参数:
default: 默认值
salt: 加密盐
max_age: 后台控制过期时间
session
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
b. 使用
def index(request):
# 获取、设置、删除Session中数据
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1']
# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 用户session的随机字符串
request.session.session_key
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
# 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key")
# 删除当前用户的所有Session数据
request.session.delete("session_key")
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
session登陆示例
def login(request):
if request.method == 'GET':
return render(request,'login.html')
else:
u = request.POST.get('user')
p = request.POST.get('pwd')
obj = models.UserAdmin.objects.filter(username=u,password=p).first()
if obj:
# 1. 生成随机字符串
# 2. 通过cookie发送给客户端
# 3. 服务端保存
# {
# 随机字符串1: {'username':'alex','email':x''...}
# }
request.session['username'] = obj.username
return redirect('/index/')
else:
return render(request,'login.html',{'msg':'用户名或密码错误'})
def index(request):
# 1. 获取客户端端cookie中的随机字符串
# 2. 去session中查找有没有随机字符
# 3. 去session对应key的value中查看是否有 username
v = request.session.get('username')
if v:
return HttpResponse('登录成功:%s' %v)
else:
return redirect('/login/')
CSRF跨站请求伪造
在网页有form表单时,get时服务端会发送一个随机字符串,post提交form表单时,需要带着随机字符串。
基本应用
@csrf_exempt # 局部禁用csrf_token验证
def test5(request):
return HttpResponse("...")
@csrf_protect # 局部启用csrf_token验证
def test5(request):
return HttpResponse("...")
CBV局部使用csrf
django的bug,不能直接对类进行装饰,必须使用 method_decorator,把装饰器当作参数传进去。
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.csrf import csrf_protect
from django.views import View
@method_decorator(csrf_exempt, name="post") # CBV局部启用csrf_token验证
@method_decorator(csrf_protect, name="post") # CBV局部禁用csrf_token验证
class Foo(View):
def get(self, request):
return HttpResponse("...")
def post(self, request):
return HttpResponse("...")