• 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("...")
    
  • 相关阅读:
    脚本(js)控制页面输入
    Javascript小技巧(6)
    解析 XML
    防止用户不输入正确用户名,密码登陆
    Javascript小技巧(5)
    自己想了一下为什么在ajax方法里找不到服务器控件
    Javascript小技巧(4)
    C#后台绑事件 和前台js方法
    Community Server专题九:MemberRole之Profile(转载)
    Community Server专题六:Delegates & Events(转载)
  • 原文地址:https://www.cnblogs.com/zouruncheng/p/7106005.html
Copyright © 2020-2023  润新知