• django 整理一


    url路由规则

      django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。

    不接收变量:
    	url(r^index/$,views.index),      	
    
    按url顺序接收变量:
    	url(r^index/(d*),views.index),		
    
    # 根据变量名接收变量:
    	url(r'^manage/(?P<name>w*)/(?P<id>d*)', views.manage),   
     
    # 根据变量名接收变量,还可以传固定变量:
    	url(r'^manage/(?P<name>w*)', views.manage,{'id':333}),    
    
    # 根据app分发不同的url:
    	url(r'^web/',include('web.urls')),    
    
    # name='add' 给地址取别名,模板跟views中都可以用别名,防止url变更而造成的麻烦
    	url('add/(d+)_(d+)/$', views.home, name='add')     
    
    	views.py中使用:
    		from django.urls import reverse
    		
    		def home(request,a,b):
    			print(reverse('add', args=(a, b)))     # reverse函数反向获取url: /add/4_9/
    			result = str(int(a) + int(b))
    			return render(request, 'home.html', {'result': result})
    	
    	template中使用:
    		不带参数的:
    			{% url 'name' %}
    		带参数的:参数可以是变量名
    			{% url 'name' 参数 %}
    		<a href="{% url 'add' 4 5 %}">{{result}}</a>
    		
    	访问的url:http://127.0.0.1:8000/add01/4_5
    	
    	
    # namespace='blog01' 别名空间:
    	url('blog02/', include('blog.urls', namespace='blog01')),
    
    	template中使用:
    		<a href="{% url 'blog:add' 4 5 %}">{{result}}</a>
    
    	blog.urls.py文件:
    		app_name = 'blog'
    
    		urlpatterns = [
    			url(r'^add01/(d+)/(d+)', views.home, name='add'),
    		]
    
    	urls.py文件:
    
    		url('blog02/', include('blog.urls', namespace='blog01')),
    		
    	views:
    
    		from django.urls import reverse
    
    		def home(request,a,b):
    			print(reverse('blog:add', args=(a, b)))     # /blog02/add01/4/5
    			result = str(int(a) + int(b))
    			return render(request, 'home.html', {'result': result})
    
    			
    	访问的url:http://127.0.0.1:8000/blog02/add01/4/5
    

     FBV 与 CBV

      所谓 FBV 和 CBV 是指 url 和view的对应关系

        FBV function base view /url/ --> 函数

        CBV class base view /url/ -->类

     1 urls文件:
     2     from django.conf.urls import patterns, include, url
     3 
     4     urlpatterns = [
     5         url(r'^index/$', views.register),
     6     ]
     7     
     8 
     9 views文件:
    10     
    11     #!/usr/bin/env python
    12     #coding:utf-8
    13 
    14     from django.shortcuts import render_to_response,HttpResponse,redirect
    15 
    16     def index(request):
    17 
    18         username = request.session.get('username')
    19         # username = request.session['username']
    20 
    21         print("username:",username)
    22         art_obj = Article.objects.all()
    23 
    24         if not username:
    25             login_status = {"register": "注册", "login": "登陆"}
    26         else:
    27             login_status = {"dynamic": "动态", "inform": "通知", "username": username}
    28 
    29         return render(request, 'index.html', {'login_status': login_status, 'art_obj': art_obj})
    FBV实例
     1 urls文件:
     2 
     3     url(r'^cbv',views.CBVtest.as_view()),
     4     
     5     
     6 views文件:
     7 
     8     class CBVtest(View):
     9         def dispatch(self, request, *args, **kwargs):
    10             print("类似装饰器:before")
    11             result = super(CBVtest, self).dispatch(request, *args, **kwargs)
    12             print("类似装饰器:after")
    13             return result
    14 
    15         def get(self, request):  # 定义get方法,get请求执行这个方法
    16             print(request.method)
    17             return HttpResponse('cbvget')
    18 
    19         def post(self, request):  # 定义post方法,post请求执行这个方法
    20             print(request.method)
    21             return HttpResponse('cbvpost')
    CBV实例

    模板引用

    block定义:
    	block定义一个模板块。子模板的block会覆盖父模板同名的block块。如果想要子模块不覆盖父模块的内容,而是新增,可以使用 block.super。
    用法:
    	{% block index %}
    		 子模板会替换父模板block index中的内容
    	{% endblock %}
    	{% block index %}
    		{{ block.super }} 
    		子模板新增的内容
    	{% endblock %}
    
    extends定义:
    	extends表示的是继承。通常,一个项目会写一个base.html和若干widget.html。项目中的大部分页面,都会继承自base.html。
    用法:
    	extends的参数一般为字符串,也可为变量。注意使用extends时,extends一定要是第一个tag标签,否则不会生效。
    
    	{% extends 'base.html' %}
    
    	extends 标签的作用是,告诉模版引擎本模版继承了 base.html 作为父模板。
    
    include定义:
    	include将其他模板,以插件的形式,直接添加在当前的模板中。
    用法:
    	可带路径、相对路径、使用变量名。
    
    	{% include 'tools.html' %}
    
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8" http-equiv="Content-Type" content="text/html">
     5 </head>
     6 <body>
     7 
     8     <h4>图书信息</h4>
     9 
    10     <p>书名: {% block title %}书名(请自定义){% endblock %}</p>
    11 
    12     <p>作者: {% block author %}作者名(请自定义){% endblock %}</p>
    13 </body>
    14 </html>
    base.html
     1 <html>
     2 <body>
     3     {% extends "temp/base.html" %}
     4 
     5     <!--{% block title %}红楼梦{% endblock %} -->      <!-- 不能同时出现两个block title 类似的,去除脏数据的方法是改成不同名称 -->
     6     <!--{% block author1 %}曹雪芹{% endblock %}-->
     7 
     8     {% block title %}
     9         {{ block.super }}     <!-- 继承base.html中的内容 -->
    10         西游记
    11     {% endblock %}
    12     {% block author %}
    13         {{ block.super }}
    14         吴承恩
    15     {% endblock %}
    16 </body>
    17 </html>
    index.html -- 子类

    模板语言

    模板中也有自己的语言,该语言可以实现数据展示
    	{{ 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 %}
    	帮助方法:
    	{{ item.event_start|date:"Y-m-d H:i:s"}}
    	{{ bio|truncatewords:"30" }}
    	{{ my_list|first|upper }}
    	{{ name|lower }}	
        
    通过simple_tag实现模版语言中的帮助方法
    
    a、在app中创建templatetags文件夹
    
    b、创建任意 .py 文件,如:xx.py
    
    	#!/usr/bin/env python
    	#coding:utf-8
    	from django import template
    	from django.utils.safestring import mark_safe
    	from django.template.base import resolve_variable, Node, TemplateSyntaxError
    	 
    	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 = "<input type='text' id='%s' class='%s' />" %(id,arg,)
    		// mark_safe使result中字符串变得可执行
    		return mark_safe(result)
    		
    c、在使用自定义simple_tag的html文件中导入之前创建的 xx.py 文件名
    	
    	{% load xxx %}
    
    d、使用simple_tag
    
    	{% my_simple_time 1 2 3%}
    	{% my_input 'id_username' 'hide'%}

    Cookie 知识点

      1. Cookie 只能保存字符串类型,request.COOKIES[key] = value 

      2.  不能保存重要的信息

      3.  只用于存在客户端的数据

    存取Cookies

       1、设置Cookies
           response.set_cookie("cookie_key","value")
       2、获取Cookies
           value = request.COOKIES["cookie_key"]
       3、删除Cookies
           response.delete_cookie("cookie_key",path="/",domain=name)
       4、检测Cookies
           if "cookie_name" is request.COOKIES :
       5、response.set_cookie() 传递一些可选的参数 描述
           参数      缺省值       描述
           max_age  None  cookies的持续有效时间(以秒计),如果设置为 None cookies 在浏览器关闭的时候就失效了。
           expires  None  cookies的过期时间,格式: "Wdy, DD-Mth-YY HH:MM:SS GMT" 如果设置这个参数,
                               它将覆盖 max_age 参数。
           path      "/"     cookie生效的路径前缀,浏览器只会把cookie回传给带有该路径的页面,这样你可以避免将
                               cookie传给站点中的其他的应用。
                               当你的应用不处于站点顶层的时候,这个参数会非常有用。
           domain      None    cookie生效的站点。你可用这个参数来构造一个跨站cookie。如, domain=".example.com"
                               所构造的cookie对下面这些站点都是可读的: www.example.com 、 www2.example.com 和
                               an.other.sub.domain.example.com 。
                               如果该参数设置为 None ,cookie只能由设置它的站点读取。
           secure      False  如果设置为 True ,浏览器将通过HTTPS来回传cookie。
    httponly=False    只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

    Cookies规则

        1、Cookies是以字典方式存储,(Key—>Value的键值对方式存储),访问是只要访问Session的键就可以得到键对应的Value
           如果:value = response.set_cookie("cookie_key","value")
        2、存储到客户端
           优点:
               数据存在在客户端,减轻服务器端的压力,提高网站的性能。
           缺点:
               1、安全性不高:在客户端机很容易被查看或破解用户回话信息
     1 def set_user(request, hour=0, name="admin"):
     2     dt = datetime.datetime.now() + datetime.timedelta(hours=int(hour))
     3     html = "设置用户%s为登录回话,过去时间: %s" % (name, str(dt))
     4     response = HttpResponse(html)
     5     response.set_cookie("username", name, expires=dt)
     6     return response
     7 
     8 
     9 def show_user(request):
    10     html = ""
    11     if "username" in request.COOKIES:
    12         name = request.COOKIES["username"]
    13 
    14         dt = datetime.datetime.now() + datetime.timedelta(hours=int(1))
    15         html = "设置用户%s过期时间为:%s" % (name,str(dt))
    16         response = HttpResponse(html)
    17 
    18         response.set_cookie("username", name, expires=dt)
    19 
    20     response = HttpResponse(html)
    21     return response
    views.py
    1     url(r'^set/(?P<hour>d+)/(?P<name>w+)',views.set_user),
    2     url(r'^show/',views.show_user),
    urls.py

    注意: 由于cookies保存 在客户端的电脑上,JavaScript和jquery也可以 操作cookie.

    <script src='/static/js/jquery.cookie.js'></script>
    $.cookie("list_pager_num", 30,{ path: '/' });

    django分页

     1 #!/usr/bin/env python
     2 
     3 from django.utils.safestring import mark_safe
     4 
     5 
     6 class PageInfo(object):
     7     def __init__(self,current, totalItem, peritems=5):
     8         self.__current = current
     9         self.__peritems = peritems
    10         self.__totalItem = totalItem
    11 
    12     def From(self):
    13         return (self.__current - 1) * self.__peritems
    14 
    15     def To(self):
    16         return self.__current * self.__peritems
    17 
    18     def TotalPage(self):
    19         result = divmod(self.__totalItem, self.__peritems)
    20         if result[1] == 0:
    21             return result[0]
    22         else:
    23             return result[0] + 1
    24 
    25 
    26 def Custompager(baseurl, currentPage, totalpage):
    27 
    28     if totalpage <= 5:
    29         begin = 1
    30         end = totalpage
    31     else:
    32         if currentPage > 2:
    33             begin = currentPage - 2
    34             end = currentPage + 2
    35             if end > totalpage:
    36                 if currentPage >= totalpage:
    37                     begin = currentPage - 5 + 1
    38                 else:
    39                     begin = currentPage - 2 - 1
    40                 end = totalpage
    41         else:
    42             begin = 1
    43             end = 5
    44 
    45     pager_list = []
    46     if currentPage <= 1:
    47         first = "<a href=''>首页</a>"
    48     else:
    49         first = "<a href='%s?p=%d'>首页</a>" % (baseurl, 1)
    50     pager_list.append(first)
    51 
    52     if currentPage > 1:
    53         prev = "<a href='%s?p=%d'>上一页</a>" % (baseurl, currentPage - 1)
    54         pager_list.append(prev)
    55 
    56     for i in range(begin, end + 1):
    57         if i == currentPage:
    58             temp = "<a href='%s?p=%d' class='selected'>%d</a>" % (baseurl, i, i)
    59         else:
    60             temp = "<a href='%s?p=%d'>%d</a>" % (baseurl, i, i)
    61         pager_list.append(temp)
    62 
    63     if currentPage < totalpage:
    64         next = "<a href='%s?p=%d'>下一页</a>" % (baseurl, currentPage + 1)
    65         pager_list.append(next)
    66 
    67     if currentPage >= totalpage:
    68         last = "<a href=''>末页</a>"
    69     else:
    70         last = "<a href='%s?p=%d'>末页</a>" % (baseurl, totalpage)
    71     pager_list.append(last)
    72 
    73     jump = """
    74         <input type="text" style="height: 10px;  15px;">
    75         <a id="jump" onclick="jump(this);">跳转</a>
    76     """
    77     pager_list.append(jump)
    78 
    79     result = ''.join(pager_list)
    80     # make_safe将字符转为可执行代码
    81     return mark_safe(result)
    page.py
     1 全局:
     2         url(r'^lx/', include('lx.urls', namespace='lx')),
     3 
     4 局部:
     5     from django.conf.urls import url
     6     from . import views
     7 
     8     app_name = 'lx'
     9 
    10     urlpatterns = [
    11         url(r'^page/', views.p),
    12     ]
    urls.py
     1 from django.shortcuts import render,redirect
     2 
     3 # Create your views here.
     4 
     5 from .page import PageInfo, Custompager
     6 
     7 
     8 def p(request):
     9 
    10     data = range(100)
    11     current_page = int(request.GET.get('p', 1))
    12     page_obj = PageInfo(current_page, 100)
    13     start = page_obj.From()
    14     end = page_obj.To()
    15     total_page = page_obj.TotalPage()
    16 
    17     if current_page > total_page:
    18         return redirect('/lx/page/?p=1')
    19 
    20     # a_list = Custompager('/lx/page/', current_page, total_page)
    21     a_list = Custompager('{% url "lx:page" %}', current_page, total_page)
    22 
    23     return render(request, 'page.html', {'l_list': data[start:end], 'a_list': a_list})
    views.py
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6 
     7     <style>
     8         a {
     9             margin: 2px;
    10             color: black;
    11             font-size: 10px;
    12         }
    13         .selected {
    14             color: red;
    15         }
    16     </style>
    17 
    18 </head>
    19 <body>
    20     {% for i in l_list %}
    21         <ul>{{i}}</ul>
    22     {% endfor %}
    23 
    24     {{ a_list }}
    25 
    26     <script>
    27         function jump(ths) {
    28             var v = ths.previousSibling.previousSibling.value;
    29             location.href = "/lx/page/?p=" + v;
    30         }
    31     </script>
    32 </body>
    33 </html>
    page.html

     

  • 相关阅读:
    Xpath语法与lxml库的用法
    Selenium--使用参考
    PhantomJS的替代品--无头浏览器(Headless Chrome)
    为什么只有一个元素的tuple要加逗号?
    反爬利器--设置代理服务器
    LeetCode 221. 最大正方形 | Python
    LeetCode 572. 另一个树的子树 | Python
    LeetCode 98. 验证二叉搜索树 | Python
    LeetCode 45. 跳跃游戏 II | Python
    LeetCode 25. K 个一组翻转链表 | Python
  • 原文地址:https://www.cnblogs.com/sshcy/p/9174069.html
Copyright © 2020-2023  润新知