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})
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')
模板引用
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>
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>
模板语言
模板中也有自己的语言,该语言可以实现数据展示
{{ 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
1 url(r'^set/(?P<hour>d+)/(?P<name>w+)',views.set_user), 2 url(r'^show/',views.show_user),
注意: 由于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)
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 ]
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})
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>