一,django的url路由系統總結css
1,url(/index/,函數或者類)html
2,url(/index/(\d+), 函數或者類)python
3,url(/index/(?P<nid>\d+),函數或者類)jquery
4,url(/index/(?P<nid>\d+),name="root",函數或者類)web
(1) 在views.py文件中經過reverse()反轉urlajax
(2) 在templates中的文件中引用{% url 'root' 1 %}shell
5,url(/crm/,include('app01.urls')進行路由分發django
6,默認值url(/index/,{'web':'root'},函數或者類)json
在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: '/' });