博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django_进阶
阅读量:5049 次
发布时间:2019-06-12

本文共 6036 字,大约阅读时间需要 20 分钟。

模板语言

* {
{ 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随机字符串。
1108839-20170702144110368-1281542564.png
注释中间件全局禁用csrf
django.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("...")

转载于:https://www.cnblogs.com/zouruncheng/p/7106005.html

你可能感兴趣的文章
关于Redis处理高并发
查看>>
C# BS消息推送 SignalR介绍(一)
查看>>
asp.net core 系列 16 Web主机 IWebHostBuilder
查看>>
WPF星空效果
查看>>
WPF Layout 系统概述——Arrange
查看>>
PIGOSS
查看>>
几款Http小服务器
查看>>
iOS 数组排序
查看>>
第三节
查看>>
PHP结合MYSQL记录结果分页呈现(比较实用)
查看>>
Mysql支持的数据类型
查看>>
openSuse beginner
查看>>
Codeforces 620E(线段树+dfs序+状态压缩)
查看>>
Windows7中双击py文件运行程序
查看>>
Market entry case
查看>>
bzoj1230 开关灯 线段树
查看>>
LinearLayout
查看>>
学习python:day1
查看>>
css3动画属性
查看>>
第九次团队作业-测试报告与用户使用手册
查看>>