zoukankan      html  css  js  c++  java
  • 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("...")
    
  • 相关阅读:
    组装query,query汇总,query字段
    POJ 1276, Cash Machine
    POJ 1129, Channel Allocation
    POJ 2531, Network Saboteur
    POJ 1837, Balance
    POJ 3278, Catch That Cow
    POJ 2676, Sudoku
    POJ 3126, Prime Path
    POJ 3414, Pots
    POJ 1426, Find The Multiple
  • 原文地址:https://www.cnblogs.com/zouruncheng/p/7106005.html
Copyright © 2011-2022 走看看