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

 

原文地址:https://www.cnblogs.com/sshcy/p/9174069.html