django 整理一
阿新 • • 發佈:2018-06-18
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文件: 10FBV實例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‘)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 responseviews.py
1 url(r‘^set/(?P<hour>\d+)/(?P<name>\w+)‘,views.set_user), 2 url(r‘^show/‘,views.show_user),urls.py
django 整理一