python 学习第二十一天,django知识(三)
一,django的url路由系统总结
1,url(/index/,函数或者类)
2,url(/index/(\d+), 函数或者类)
3,url(/index/(?P<nid>\d+),函数或者类)
4,url(/index/(?P<nid>\d+),name="root",函数或者类)
(1) 在views.py文件中通过reverse()反转url
(2) 在templates中的文件中引用{% url 'root' 1 %}
5,url(/crm/,include('app01.urls')进行路由分发
6,默认值url(/index/,{'web':'root'},函数或者类)
在views.py中定义函数 def func(reqeust,web):return ...来接收web这个参数
7,命名空间
(1)project.urls.py
from djanogo.conf.urls import url,include urlpatterns = [ url(r'^a/',include('app01.urls',namespace='author-polls')), url(r'^b/',include('app01.urls',namespace='publisher-polls')), ]
(2)app01.urls.py
from django。conf.urls import url from app01 import views app_name = 'app01' urlpatterns = [ url(r'^(?P<pk>\d+/$',views.detail,name='detail') ]
(3)app01.views.py
def detail(request,pk): print(request.resolver_match) return HttpResponse(pk)
以上定义带命名空间的url之后,使用name生成URL时候,应该如下:
v = reverse('author-polls:detail',kwargs={'pk':11})
{% url 'app01:detail' pk=12 pp=99 %}
django 中的路由系统和其它语言的框架有所不同,在django中每个请求的url都要有一条路由映射,这样才能将请求交给对应的view中的函数去处理.其它大部分的WEB框架则是对一类的url请求做一条路由映射,从而使路由系统变得简洁
二,django的路由请求周期知识点
(1)Form 表单提交,页面肯定刷新,整个流程为,提交form 表单,发送数据到到后台进行处理,然后等待后台处理完成返回数据,并跳转到其它页面
用户提交请求到url.py文件中的url,url接收到请求后,匹配到后端的视图函数,并将数据发送到后端,后端将请求处理完成之后,或者直接返回字符串给用户(HttpRespose),或者通过render方法中的open函数打开相应的templates中的html文件,将其中的所有的变量进行替换,最终将html文件和数据都已字符串的形式发送给用户,或者用redirect('/index/')将另外一个请求已字符串的形式发送给用户,用户跳转到其它页面
(2)ajax 提交
$.ajax({ url:'/index/'; data:{'k':'v','list':[1,2,3,4]}; #或者$(form对象).serilize() 已列表的形式获取整个form中的数据 type:'POST'; #向后台提交数据的方式 dataType:'JSON'; #以json形式向后台提交数据 traditional:true; #需要向后台发送列表时,必须以加这个参数 success: function(d) { #d 为形式参数,可以任意定义
location.reload() #刷新整个页面
location.href() #跳转到其它页面 } })
三,django views知识点
(1)views中的请求方法
def func(request): request.POST request.GET request.FILES request.getlist request.method request.path_info #获取当前的请求的url
(2)request.environ 封装了用户所有的请求头部信息
from django.core.handlers.wsgi import WSGIRequest request.environ request.environ['HTTP_USER_AGENT']
四,模板的继承
1,在主模板中定义block {% block title %}{% endblock %}
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %} {% endblock %}</title> <link rel="stylesheet" href="/static/commons.css" /> <style> .pg-header{ height: 50px; background-color: seashell; color: green; } </style> {% block css %} {% endblock %} </head> <body> <div class="pg-header">小男孩管理</div> <div> <a>asdf</a> <a id="">asdf</a> <a>asdf</a> <a>asdf</a> <a>asdf</a> </div> <iframe src="/"></iframe> </body> </html>
2,在子模板中引用block,一个html 只能继承一个模板,但可以有多个include
{% extends 'master.html' %} {% block title %}用户管理{% endblock %} {% block content %} <h1>用户管理</h1> <ul> {% for i in u %} <li>{{ i }}</li> {% endfor %} </ul> {% for i in u %} {% include 'tag.html' %} {% endfor %} {% endblock %} {% block css %} <style> body{ background-color: red; } </style> {% endblock %} {% block js %} <script></script> {% endblock %}
3,模板中的自定义simple_tag
(1)在app 中创建templatetags模板,且目录名称必须为这个名字
(2)创建任意.py文件,如:xx.py
#!/usr/bin/env python #coding:utf-8 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 = "<input type='text' id='%s' class='%s' />" %(id,arg,) return mark_safe(result)
(3)在使用自定义simple_tag的html文件中导入之前创建的xx.py文件名
{% load xx %}
(4)使用simple_tag
{% my_simple_time 1 2 3%} {% my_input 'id_username' 'hide'%}
(5)在settings中配置当前的app,不然django无法找到自定义的simple_tag
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', )
4,自定义simple_tag 中的装饰器用法
(1)@register.simple_tag 使用方法
{% my_simple_time 1 2 3%} #my_simple为.py文件中的函数名,可以传多个参数,并且参数之间允许有空格
(2)@register.filter
{{"参数一"|处理函数名:"参数二"}} #参数二只能有一个,如果需要传递两个参数,可以“参数二,参数三”,然后再后端函数中进行单独处理,
#应用场景在模板语言中的if判断中,例如{% if "参数一"|处理函数名:"参数二" %}
五,django Cookie
1,获取Cookie
request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) 参数: default: 默认值 salt: 加密盐 max_age: 后台控制过期时间
2,设置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获取(不是绝对,底层抓包可以获取到也可以被覆盖)
3,由于Cookie保存在客户端电脑上,所以Javascript或者Jquery 都可以操作Cookie
<script src='/static/js/jquery.cookie.js'></script> $.cookie("list_pager_num", 30,{ path: '/' });