python 學習第二十一天,django知識(三)

一,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: '/' });
相關文章
相關標籤/搜索