django_进阶

模板语言

* {{ 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 = "&lt;input type='text' id='%s' class='%s' /&gt; " %(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随机字符串。 ![](http://images2015.cnblogs.com/blog/1108839/201707/1108839-20170702144110368-1281542564.png) **注释中间件全局禁用csrf** `django.middleware.csrf.CsrfViewMiddleware` **局部禁用和使用csrf验证** **FBV**单独在views函数中增加特殊的装饰器 ``` # csrf跨站请求伪造fbv局部使用 from django.views.decorators.csrf import csrf_exempt from 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_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("...")
posted @ 2017-07-02 14:38  pirate邹霉  阅读(149)  评论(0编辑  收藏  举报