第八章(3)


  1. views:请求的其他信息
  2. 模板继承和引用
  3. 自定义函数(simple_tag & filter)
  4. 分页示例
  5. cookie
  6. CBV和FBV用户认证装饰器

1.views-请求的其他信息

1 from django.core.handlers.wsgi import  WSGIRequest
2 
3 request.environ
4 request.environ['HTTP_USER_AGENT']

2.模板继承和引用

1 urlpatterns = [
2     #path('admin/', admin.site.urls),
3     url(r'tp11',views.tp11),
4     url(r'tp12',views.tp11),
5     url(r'tp13',views.tp11),
6 
7 ]
urls.py
 1 def tp11(request):
 2 
 3     user_list = [1,2,3,]
 4 
 5     return render(request,'tp11.html',{'u':user_list})
 6 
 7 
 8 def tp12(request):
 9     name = 'root'
10 
11     return render(request, 'tp12.html', {'name': name})
12 
13 
14 def tp13(request):
15     status = '已删除'
16 
17     return render(request, 'tp13.html', {'status': status})
views.py
 1 
 2 "en">
 3 
 4     "UTF-8">
 5     {% block title%} {% endblock %}
 6     "stylesheet" href="/static/commcons.css" />
 7     
14     {% block css %} {% endblock %}
15 
16     
class="pg-header">潇韩海
17 18 {% block content %} {% endblock %} 19
class="pg-header">
20 21 {% block js %} {% endblock %} 22 23
master.html
 1 {% extends 'master.html'%}
 2 
 3 {% block title %} 用户管理 {% endblock %}
 4 
 5 {% block content %}
 6     
    7 {% for i in u %} 8
  • {{ i }}
  • 9 {% endfor %} 10
11 12 {% for i in u %} 13 {% include 'tag.html' %} 14 {% endfor %} 15 {% endblock %} 16 17 {% block css %} 18 23 {% endblock %} 24 25 {% block js %} 26 27 {% endblock %}
tp11.html
1 
2 "text"/> 3 "submit" /> 4
tag.html

3.自定义函数(simple_tag & filter)

simple_tag
a. app创建templatetags目录
b. 任意xxoo.py文件
c.创建template对象reqister
d.
   @register.simple_tag
   def func(a1,a2)
   	return "asasd"
   	
 e.settings中注册APP
 f. 顶部{% load xxoo %}
 g. {% 函数名 arg1 arg2%}
 
 缺点:
     参数任意
1  url(r'tp14/',views.tp14),
urls.py
 1 __author__ = 'Administrator'
 2 from django import template
 3 from django.utils.safestring import mark_safe
 4 
 5 register = template.Library()
 6 
 7 @register.simple_tag
 8 def houyafan(a1,a2,):
 9     return a1 + a2
10 
11 @register.filter
12 def jiajingze(a1,a2):
13     return a1 + str(a2)
app01/templatetags/xxoo.py
 1 {% load xxoo %}
 2 
 3 "en">
 4 
 5     "UTF-8">
 6     
 7 
 8 
 9     {{ name }}
10     {{ name|lower }}
11     {{ name|truncatechars:"3" }}
12 
13     {% houyafan  2  8  %}
14     
15     {{ "maliya"|jiajingze:"LS,YH" }}
16     
17      {% if "maliya"|jiajingze:"LS,YH" %}
18      {% endif %}
19 
20 
21 
22 
tp14.html

4.分页示例

1 url(r'user_list/',views. user_list),
urls.py
 1 LISI = []
 2 for i in range(109):
 3     LISI.append(i)
 4 
 5 def user_list(request):
 6     current_page = request.GET.get('p',1)
 7     current_page = int(current_page)
 8     start = (current_page-1) * 10
 9     end = current_page * 10
10     data = LISI[start:end]
11 
12     all_count = len(LISI)
13     count,y = divmod(all_count,10)
14     if y:
15         count += 1
16 
17     page_list = []
18     for i in range(1,count+1):
19         if i == current_page:
20             temp = '%s' %(i,i)
21         else:
22             temp = '%s' %(i,i)
23 
24         page_list.append(temp)
25     page_str = mark_safe("".join(page_list))
26     return render(request,'user_list.html', {'li':data,'page_str':page_str})
views.py
 1 
 2 "en">
 3 
 4     "UTF-8">
 5     Title
 6     
18 
19 
20     
    21 {% for item in li %} 22 {% include 'li.html' %} 23 {% endfor %} 24
25
class="pagination"> 26 {{ page_str }} 27
28 29
user_list.html
1 
  • {{ item }}
  • li.html

    分页优化版

     1 from django.shortcuts import render
     2 from django.utils.safestring import mark_safe
     3 from  utils import pagination
     4 LISI = []
     5 for i in range(500):
     6     LISI.append(i)
     7 
     8 def user_list(request):
     9     current_page = request.GET.get('p',1)
    10     current_page = int(current_page)
    11 
    12     val = request.COOKIES.get('per_page_count',10)
    13     val = int(val)
    14 
    15     page_obj = pagination.Page(current_page,len(LISI),val)
    16 
    17     data = LISI[page_obj.start:page_obj.end]
    18 
    19     page_str = page_obj.page_str("/user_list")
    20 
    21     return render(request,'user_list.html', {'li':data,'page_str': page_str})
    22     
    23   ###############################################################################
    24   from  utils import pagination
    25 
    26 LIST = []
    27 for i in range(500):
    28     LIST.append(i)
    29 
    30 def user_list(request):
    31     current_page = request.GET.get('p', 1)
    32     current_page = int(current_page)
    33 
    34     val = request.COOKIES.get('per_page_count')
    35     val = int(val)
    36     page_obj = pagination.Page(current_page,len(LIST),val)
    37     data = LIST[page_obj.start:page_obj.end]
    38 
    39     page_str = page_obj.page_str("/user_list/")
    40 
    41     return render(request,'user_list.html', {'li': data,'page_str': page_str})
    views.py
     1 __author__ = 'wei.han'
     2 from django.utils.safestring import mark_safe
     3 
     4 
     5 class Page:
     6     def __init__(self, current_page, data_count, per_page_count=10, pager_num=7):
     7         #用户点击值
     8         self.current_page = current_page
     9         #数据总数
    10         self.data_count = data_count
    11         #每页显示10条数据
    12         self.per_page_count = per_page_count
    13         #7页
    14         self.pager_num = pager_num
    15 
    16     #开始(显示居中)
    17     @property
    18     def start(self):
    19         return (self.current_page - 1) * self.per_page_count
    20 
    21     # 结束(显示居中)
    22     @property
    23     def end(self):
    24         return self.current_page * self.per_page_count
    25 
    26     #总页数
    27     @property
    28     def total_count(self):
    29         v, y = divmod(self.data_count, self.per_page_count)
    30         if y:
    31             v += 1
    32         return v
    33 
    34     #url
    35     def page_str(self, base_url):
    36         page_list = []
    37 
    38         if self.total_count < self.pager_num:
    39             start_index = 1
    40             end_index = self.total_count + 1
    41         else:
    42             if self.current_page <= (self.pager_num + 1) / 2:
    43                 start_index = 1
    44                 end_index = self.pager_num + 1
    45             else:
    46                 start_index = self.current_page - (self.pager_num - 1) / 2
    47                 end_index = self.current_page + (self.pager_num + 1) / 2
    48                 if (self.current_page + (self.pager_num - 1) / 2) > self.total_count:
    49                     end_index = self.total_count + 1
    50                     start_index = self.total_count - self.pager_num + 1
    51 
    52         if self.current_page == 1:
    53             prev = '上一页'
    54         else:
    55             prev = '上一页' % (base_url, self.current_page - 1,)
    56         page_list.append(prev)
    57 
    58         for i in range(int(start_index), int(end_index)):
    59             if i == self.current_page:
    60                 temp = '%s' % (base_url, i, i)
    61             else:
    62                 temp = '%s' % (base_url, i, i)
    63             page_list.append(temp)
    64 
    65         if self.current_page == self.total_count:
    66             nex = '下一页'
    67         else:
    68             nex = '下一页' % (base_url, self.current_page + 1,)
    69         page_list.append(nex)
    70 
    71         jump = """
    72         GO
    73         
    79         """ % (base_url,)
    80 
    81         page_list.append(jump)
    82 
    83         page_str = mark_safe("".join(page_list))
    84 
    85         return page_str
    pagination.py
     1 
     2 "en">
     3 
     4     "UTF-8">
     5     
     6     
    18 
    19 
    20     
      21 {% for item in li %} 22 {% include 'li.html' %} 23 {% endfor %} 24
    25 26
    27 33
    34 35
    class="pagination"> 36 {{ page_str }} 37
    38 39 40 41 56 57
    user_list.html

    5.cookie

    rep = HttpResponse(...) 或 rep = render(request, ...)
     
    rep.set_cookie(key,value,...)
    rep.set_signed_cookie(key,value,salt='加密盐',...)
        参数:
            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.get('username111')
    
    reqpone = render(request,'index.html')
    
    设置cookie,关闭浏览器后就失效
    response.set_cookie('key','value')
    
    设置cookie,10秒后失效
    response.set_cookie('username111','value',max_age=10)
    return response
    
    设置cookie,5秒后失效
    import datetime
    current_date = datetime.datetime.utcnow()
    current_date = current_date + datetime.timedelta(seconds=5)
    res.set_cookie('username111',u,expires=current_date)

     cookie加密

    #request.COOKIES.get('...')
    #request.set_cookie(...)
    obj = HttpResponse('s')
    加密
    obj.set_signed_cookie('username','kanbazi',salt='jiamizifuchuan')
    获取加密
    request.get_signed_cookie('username',salt="jiamizifuchuan")
    
    return response
    

    6.CBV和FBV用户认证装饰器

    FBV

    1 url(r'index/',views.index),
    urls.py
     1 from django.shortcuts import render,redirect
     2 from django.utils.safestring import mark_safe
     3 
     4 user_info = {
     5     'dachengzi': {'pwd': "123"},
     6     'kanbazi': {'pwd': "123"},
     7 }
     8 
     9 
    10 def login(request):
    11     if request.method == "GET":
    12         return render(request, 'login.html')
    13     if request.method == "POST":
    14         u = request.POST.get('username')
    15         p = request.POST.get('pwd')
    16         dic = user_info.get(u)
    17         if not dic:
    18             return render(request,'login.html')
    19         if dic['pwd'] == p:
    20             res = redirect('/index/')
    21             res.set_cookie('username111',u)
    22             return res
    23         else:
    24             return render(request,'login.html')
    25             
    26             
    27 def auth(func):
    28     def inner(request,*arges,**kwargs):
    29         v = request.COOKIES.get('username111')
    30         if not v:
    31             return redirect('/login/')
    32         return func(request,*arges,**kwargs)
    33     return inner
    34     
    35 
    36 @auth
    37 def index(request):
    38     v = request.COOKIES.get('username111')
    39     return render(request,'index.html',{'current_user': v})
    views.py

    CBV

     1 from django import views
     2 from django.utils.decorators import method_decorator
     3 
     4 @method_decorator(auth,name='dispatch')
     5 class Order(views.View):
     6 
     7     # @method_decorator(auth)
     8     # def dispatch(self,request, *args,**kwargs):
     9     #      return super(Order,self).dispatch(request, *args, **kwargs)
    10 
    11     # @method_decorator(auth)
    12     def get(self,request):
    13         v = request.COOKIES.get('username111')
    14         return render(request,'index.html',{'current_user': v})
    15 
    16     def post(self,request):
    17         v = request.COOKIES.get('username111')
    18         return render(request,'index.html',{'current_user': v})
    CBV
     1 
     2 "en">
     3 
     4     "UTF-8">
     5     Title
     6 
     7 
     8     
    "/login/" method="POST"> 9 "text" name="username" placeholder="用户名"/> 10 "password" name="pwd" placeholder="密码"/> 11 "submit"/> 12
    13 14
    login.html
     1 
     2 "en">
     3 
     4     "UTF-8">
     5     Title
     6 
     7 
     8     

    欢迎登录:{{ current_user }}

    9 10
    index.html