1. 程式人生 > >django 整理一

django 整理一

TE closed 都是 lose content style per AS bsp

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 -- 子類

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。

Cookies規則

    1、Cookies是以字典方式存儲,(Key—>Value的鍵值對方式存儲),訪問是只要訪問Session的鍵就可以得到鍵對應的Value
       如果:value = response.set_cookie("cookie_key","value")
    2、存儲到客戶端
       優點:
           數據存在在客戶端,減輕服務器端的壓力,提高網站的性能。
       缺點:
           1、安全性不高:在客戶端機很容易被查看或破解用戶回話信息

Cookies實例:

技術分享圖片
 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

  

 

django 整理一