模板语言
* { { item }}* {% for item in item_list %} { { item }} {% 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 templatefrom django.utils.safestring import mark_safe register = template.Library() @register.simple_tagdef my_simple_time(v1,v2,v3): return v1 + v2 + v3 @register.simple_tagdef 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_token %} 在form表单中添加字段,页面会在渲染后生成一个隐藏的input的框,用于传递csrf随机字符串。 注释中间件全局禁用csrfdjango.middleware.csrf.CsrfViewMiddleware
局部禁用和使用csrf验证 FBV单独在views函数中增加特殊的装饰器 # csrf跨站请求伪造fbv局部使用from django.views.decorators.csrf import csrf_exemptfrom django.views.decorators.csrf import csrf_protect@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_decoratorfrom django.views.decorators.csrf import csrf_exemptfrom django.views.decorators.csrf import csrf_protectfrom 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("...")