1.pip3 install djangocss
2.到官網下載安裝包html
執行:python3 setup.py installpython
3.windows上添加環境變量mysql
在pyth中加入C:\Python35\Scripts(若是不添加,執行時就必須相應的文件夾下執行djingo-admin.exe)正則表達式
命令:sql
1.建立project數據庫
djingo-admin startproject mysite(項目的名字)建立目錄django
建立的mysite目錄windows
mysite瀏覽器
-mysite 內部都是些配置文件
-manage.py 管理當前project
2.運行
傳遞
cd mysite
python3 manage.py runserver 127.0.0.1:8000
在瀏覽器上輸入127.0.0.1:8000
3.建立app(app至關於一個項目中的各個模塊,app處理業務邏輯)
例子:
project 運維平臺
配置文件
管理文件
app-01 資產管理
app-02 監控
......
經過manage.py建立app
cd mysite
python manage.py startapp cmdb(名字)
建立完成後,進入到cmdb中就能夠看到不少.py文件
其中migrations文件、modles.py(建立數據庫,操做數據庫)是操做數據庫的
admin.pyh後臺管理,配置的djingo自帶的後臺
apps.py 當前app的配置
tests.py 單元測試
views.py 業務處理
pycharm
新建project
pycharm會自動執行djingo-admin startproject mysite
建立app,點擊pycharm的termial,執行python manage.py startapp cmdb(名字)
運行:python3 manage.py runserver 127.0.0.1:8000(terminal終端)或者點擊pycharm中的綠色箭頭
若是想編輯地址或者端口,點擊箭頭左邊的project的名字,點擊edit configrations
數據庫:jingo自帶的數據庫(sqlite)
若是想換成mysql,能夠作以下修改
settings
1 DATABASES = { 2 3 'default': { 4 5 'ENGINE': 'django.db.backends.mysql', 6 7 'NAME':'dbname', 8 9 'USER': 'root', 10 11 'PASSWORD': 'xxx', 12 13 'HOST': '', 14 15 'PORT': '', 16 17 } 18 19 }
因爲Django內部鏈接MySQL時使用的是MySQLdb模塊,而python3中還無此模塊,因此須要使用pymysql來代替
以下設置放置的與project同名的配置的 __init__.py文件中
import pymysql
pymysql.install_as_MySQLdb()
1 TEMPLATE_DIRS = ( 2 3 os.path.join(BASE_DIR,'templates'), 4 5 )
1 STATICFILES_DIRS = ( 2 3 os.path.join(BASE_DIR,'static'), 4 5 )
在models.py中建立數據庫
建立類------》至關於表
類中的字段----》至關於表中的列
1 class UserInfo(models.Model): 2 nid = models.AutoField(primary_key=True) 3 username = models.CharField(max_length=32) 4 pwd = models.CharField(max_length=64) 5 age = models.IntegerField()
寫完後,要執行命令建立
在終端執行 cd /mysite
根據app的models.py生成數據庫表
python manage.py makemigrations
python manage.py migrate
注意:要在settings註冊app名字(經過app註冊,控制都讓那些app生成數據庫表)
創建的項目中會有幾個文件
settings.py總體的配置文件
urls.py 網頁的對應關係
wsgi.py djingo是基於wsgi開發的
例子:
urlpatterns = [ url(r'^admin/', admin.site.urls), 後面的admin.site.urls是一個函數,負責處理業務的,當url中匹配到前面的關鍵詞後,這個函數開始處理請求。]
這個是djingo自帶的後臺管理,在url中加127.0.0.1:8001/admin
通常會把處理業務的函數放在app的views.py中
這裏就須要先把app中的views導入到urls這個文件中
from cmdb import views
建立一個對應關係
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^index/',views.index), 路由映射
]
在views中建立一個函數(標紅爲重要信息)
from django.shortcuts import render
from django.shortcuts import HttpResponse
# Create your views here.
def index(requst):
return HttpResponse('OK')
這個函數至少包含一個參數request,request封裝了用戶請求相關信息。,return後面返回的能夠是一個網頁,也能夠去一個html文件中拿到,
若是想返回的是網頁,就必須是return render(request,'index.html'),此時咱們要告訴jingo網頁的位置,去settings設置,找到TEMPLATES,
有個 'DIRS': [os.path.join(BASE_DIR, 'templates')],BASE_DIR就是建立項目的目錄位置,下面有個templates目錄,只要把html文件放到這裏就能夠了。
若是此時目錄下面有個index.html就會找到了。
提交登錄頁面
在一樣的位置建立url路由映射,建立登錄網頁,寫登錄函數
1 urlpatterns = [ 2 # url(r'^admin/', admin.site.urls), 3 url(r'^index/',views.index), 4 url(r'^login/', views.login), 5 ]
1 def login(request): 2 return render(request,'login.html')
登錄函數本身寫
注意:咱們提交網頁的方式是以post方式提交的,此時,須要咱們到settings中將MIDDLEWARE下的'django.middleware.csrf.CsrfViewMiddleware'註釋掉,不然沒法提交。
接下來,咱們就要對用戶提交的數據進行驗證
須要對登錄函數進行完善(render裏寫的是模版,redirect寫的是url)
1 from django.shortcuts import render 2 from django.shortcuts import HttpResponse 3 from django.shortcuts import redirect 4 5 # Create your views here. 6 def index(request): 7 # return HttpResponse('OK') 8 return render(request,'index.html') 9 def login(request): 10 #request.method "GET" "POST" 用戶已什麼方式提交,就以什麼方式獲取 11 if request.method == 'GET': 12 return render(request,'login.html') 13 elif request.method == 'POST': 14 #獲取用戶提交的數據(以字典的防禦死提交) 15 username = request.POST.get('user') #此處用get獲取而不用 request.POST[user]是防止沒有找到數據是報錯 16 password = request.POST.get('pwd') 17 if username == 'root' and password == '111111': 18 # return redirect('http://www.baidu.com') 19 return redirect('/index/') #這裏寫的至關於路徑,在127.0.0.1:8001/index/ 20 else: 21 return render(request,'login.html')
實現數據的讀取,以及添加
1.讀取html文件內容
將特殊的標記和{'data':DB}進行渲染,獲得一個字符串
2.將html內容返回給用戶
1 from django.shortcuts import render 2 from django.shortcuts import HttpResponse 3 from django.shortcuts import redirect 4 DB = [ 5 {'hostname':'c1.com','port':80}, 6 {'hostname':'c2.com','port': 81}, 7 {'hostname':'c3.com','port': 82}, 8 {'hostname':'c4.com','port': 83}, 9 ] 10 # Create your views here. 11 def index(request): 12 # return HttpResponse('OK') 13 if request.method == 'GET': 14 #用戶獲取數據 pymysql 15 #模版渲染 16 return render(request,'index.html',{'data':DB}) 17 """ 18 1.讀取html文件內容 19 將特殊的標記和{'data':DB}進行渲染,獲得一個字符串 20 2.將html內容返回給用戶 21 """ 22 if request.method == 'POST': 23 host = request.POST.get('host') 24 port = request.POST.get('port') 25 temp = {'hostname':host,'port':port} 26 DB.append(temp) 27 return render(request, 'index.html', {'data': DB}) #再次渲染便可 28 def login(request): 29 #request.method "GET" "POST" 用戶已什麼方式提交,就以什麼方式獲取 30 if request.method == 'GET': 31 #用戶獲取數據 pymysql 32 #模版渲染 33 return render(request,'index.html',{'data':DB}) 34 return render(request,'login.html') 35 elif request.method == 'POST': 36 #獲取用戶提交的數據(以字典的防禦死提交) 37 username = request.POST.get('user') #此處用get獲取而不用 request.POST[user]是防止沒有找到數據是報錯 38 password = request.POST.get('pwd') 39 if username == 'root' and password == '111111': 40 # return redirect('http://www.baidu.com') 41 return redirect('/index/') #這裏寫的至關於路徑,在127.0.0.1:8001/index/ 42 else: 43 return render(request,'login.html')
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>歡迎登錄</h1> 9 <h3>添加內容</h3> 10 <form action="/index/" method="POST"> 11 <input type="text" placeholder="主機名" name="host" /> 12 <input type="text" placeholder="端口" name="port" /> 13 <input type="submit" value="增長" /> 14 </form> 15 <h3>資產列表</h3> 16 <table border="1"> 17 <thead> 18 <tr> 19 <th>主機名</th> 20 <th>端口</th> 21 </tr> 22 </thead> 23 <tbody> 24 {% for row in data %} 25 <tr> 26 <td>{{row.hostname}}</td> 27 <td>{{row.port}}</td> 28 </tr> 29 {% endfor %} 30 </tbody> 31 </table> 32 </body> 33 </html>
靜態文件的設置
1.要在project的目錄下創建一個靜態文件,和app目錄在同一界別
2.在網頁加入文件連接
3. 接下來就要告訴jingo文件的位置,在settings中最下面添加
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static'),
)
這個是元組,必需要有逗號
在項目中的models中操做
1 from __future__ import unicode_literals 2 3 from django.db import models 4 5 # Create your models here. 6 class UserInfo(models.Model): 7 nid = models.AutoField(primary_key=True) 8 username = models.CharField(max_length=32) 9 pwd = models.CharField(max_length=64) 10 age = models.IntegerField()
執行命令,生成表
python manage.py makemigrations
python manage.py migrate
models.tb.objects.all()
models.tb.objects.filter(nid=1)
models.tb.objects.filter(nid=1).first()
也能夠將filter換爲get,可是get只適用於單個數據,若是有多個查詢結果,就會報錯
只想查看錶中個別字段中的內容:
models.Book.objects.values('name','price')
models.Book.objects.exclude(name='py')反查詢
1 def users(request): 2 users_list = models.UserInfo.objects.all() 3 return render(request,'users.html',{'data':users_list})
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>用戶列表</h1> 9 <ul> 10 {% for row in data %} #這裏循環的東西必定是字典的key 11 <li> 12 {{ row.nid}} - {{ row.username }} - 13 {{ row.pwd }}- {{ row.age }} - 14 </li> 15 {% endfor %} 16 </ul> 17 </body> 18 </html>
models.tb.objects.create(...)
obj = models.tb(...)
obj.save()
1 from django.shortcuts import render 2 from django.shortcuts import HttpResponse 3 from A1 import models 4 from django.shortcuts import redirect 5 # Create your views here. 6 def users(request): 7 users_list = models.UserInfo.objects.all() 8 return render(request,'users.html',{'data':users_list}) 9 def add_user(request): 10 if request.method == 'GET': 11 return render(request,'add_user.html ') 12 elif request.method == 'POST': 13 u = request.POST.get('user') 14 p = request.POST.get('pwd') 15 a = request.POST.get('age') 16 # obj = models.UserInfo(username=u,pwd=p,age=a) 17 # obj.save() 18 models.UserInfo.objects.create(username=u,pwd=p,age=a) 19 return redirect('/users')
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <form method="POST" action="/add_user"> 9 <input type="text" name="user" placeholder="用戶名" /> 10 <input type="text" name="pwd" placeholder="密碼" /> 11 <input type="text" name="age" placeholder="年齡" /> 12 <input type="submit" value="提交"> 13 14 </form> 15 </body> 16 </html>
urls urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^users', views.users), url(r'^add_user',views.add_user), ]
添加按鈕,須要跳轉,經過a標籤的href,href='/add_user'
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>用戶列表</h1> 9 <a href="/add_user">添加</a> 10 <ul> 11 {% for row in data %} 12 <li> 13 {{ row.nid}} - {{ row.username }} - 14 {{ row.pwd }}- {{ row.age }} - 15 </li> 16 {% endfor %} 17 </ul> 18 </body> 19 </html>
models.tb.objects.all().delete()
models.tb.objects.filter(nid=1).delete()
1 views 2 from django.shortcuts import render 3 from django.shortcuts import HttpResponse 4 from A1 import models 5 from django.shortcuts import redirect 6 # Create your views here. 7 def users(request): 8 users_list = models.UserInfo.objects.all() 9 return render(request,'users.html',{'data':users_list}) 10 def add_user(request): 11 if request.method == 'GET': 12 return render(request,'add_user.html ') 13 elif request.method == 'POST': 14 u = request.POST.get('user') 15 p = request.POST.get('pwd') 16 a = request.POST.get('age') 17 # obj = models.UserInfo(username=u,pwd=p,age=a) 18 # obj.save() 19 models.UserInfo.objects.create(username=u,pwd=p,age=a) 20 return redirect('/users') 21 def delete_user(request): 22 nnid = request.GET.get('nid') 23 models.UserInfo.objects.filter(nid=nnid).delete() 但凡遇到fileter、all時,獲取的是列表
1 urlpatterns = [ 2 url(r'^admin/', admin.site.urls), 3 url(r'^users', views.users), 4 url(r'^add_user', views.add_user), 5 url(r'^delete_user',views.delete_user), 6 ]
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>用戶列表</h1> 9 <a href="/add_user">添加</a> 10 <ul> 11 {% for row in data %} 12 <li> 13 {{ row.nid}} - {{ row.username }} - 14 {{ row.pwd }}- {{ row.age }} - 15 <a href="/delete_user?nid={{ row.nid }}">刪除</a> #此處書寫相似於網頁地址形式,以get形式傳值 16 </li> 17 {% endfor %} 18 </ul> 19 </body> 20 </html>
models.tb.objects.all().update(...)
models.tb.objects.filter(nid=1).update(...)
1 urlpatterns = [ 2 url(r'^admin/', admin.site.urls), 3 url(r'^users', views.users), 4 url(r'^add_user', views.add_user), 5 url(r'^delete_user',views.delete_user), 6 url(r'^edit_user',views.edit_user), 7 ]
1 from django.shortcuts import render 2 from django.shortcuts import HttpResponse 3 from A1 import models 4 from django.shortcuts import redirect 5 # Create your views here. 6 def users(request): 7 users_list = models.UserInfo.objects.all() 8 return render(request,'users.html',{'data':users_list}) 9 def add_user(request): 10 if request.method == 'GET': 11 return render(request,'add_user.html ') 12 elif request.method == 'POST': 13 u = request.POST.get('user') 14 p = request.POST.get('pwd') 15 a = request.POST.get('age') 16 # obj = models.UserInfo(username=u,pwd=p,age=a) 17 # obj.save() 18 models.UserInfo.objects.create(username=u,pwd=p,age=a) 19 return redirect('/users') 20 def delete_user(request): 21 nnid = request.GET.get('nid') 22 models.UserInfo.objects.filter(nid=nnid).delete() 23 return redirect('/users') 24 def edit_user(request): 25 if request.method == 'GET': 26 nnid = request.GET.get('nid') 27 v = models.UserInfo.objects.filter(nid=nnid).first() #首先經過nid獲取,全部的值,而後經過render將之給html,並進行渲染 28 return render(request,'edit_user.html',{'obj':v}) 29 elif request.method == 'POST': #將提交的數據提取,併到數據庫更新 30 nnid = request.POST.get('nid') 31 u = request.POST.get('user') 32 p = request.POST.get('pwd') 33 a = request.POST.get('age') 34 models.UserInfo.objects.filter(nid=nnid).update(username=u,pwd=p,age=a) 35 return redirect('/users')
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <form action="/edit_user" method="POST"> 9 <p style="display: none"><input type="text" name="nid" value="{{ obj.nid }}"></p> #經過values將值默認添加到文本框彙總。咱們要經過nid更新至,可是不能讓用戶看到 10 <input type="text" name="user" placeholder="用戶名" value="{{ obj.username }}" /> 11 <input type="text" name="pwd" placeholder="密碼" value="{{ obj.pwd }}" /> 12 <input type="text" name="age" placeholder="年齡" value="{{ obj.age}}" /> 13 <input type="submit" value="提交"> 14 15 </form> 16 17 </body> 18 </html>
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>用戶列表</h1> 9 <a href="/add_user">添加</a> 10 <ul> 11 {% for row in data %} 12 <li> 13 {{ row.nid}} - {{ row.username }} - 14 {{ row.pwd }}- {{ row.age }} - 15 <a href="/delete_user?nid={{ row.nid }}">刪除</a> - 16 <a href="edit_user?nid={{ row.nid }}">編輯</a> 17 </li> 18 {% endfor %} 19 </ul> 20 </body> 21 </html>
1.^users$,來精確匹配
2.users.html 來匹配,僞形成靜態頁面
3. url(r'^edit_user_new-(?P<nnid>\d+).html$', views.edit_user_new)
1 urlpatterns = [ 2 url(r'^admin/', admin.site.urls), 3 url(r'^users$', views.users), 4 url(r'^add_user$', views.add_user), 5 url(r'^delete_user$',views.delete_user), 6 url(r'^edit_user$',views.edit_user), 7 url(r'^edit_user_new-(?P<nnid>\d+).html$',views.edit_user_new), 8 ]
注意:若是r'^add_user$'若是add_user首尾不加控制,那麼r'^edit_user_new-(?P<nnid>\d+).html$就永遠執行不了,若是不加,
只要匹配到add_user就會執行第一個
1 from django.shortcuts import render 2 from django.shortcuts import HttpResponse 3 from A1 import models 4 from django.shortcuts import redirect 5 # Create your views here. 6 def users(request): 7 users_list = models.UserInfo.objects.all() 8 return render(request,'users.html',{'data':users_list}) 9 def add_user(request): 10 if request.method == 'GET': 11 return render(request,'add_user.html ') 12 elif request.method == 'POST': 13 u = request.POST.get('user') 14 p = request.POST.get('pwd') 15 a = request.POST.get('age') 16 # obj = models.UserInfo(username=u,pwd=p,age=a) 17 # obj.save() 18 models.UserInfo.objects.create(username=u,pwd=p,age=a) 19 return redirect('/users') 20 def delete_user(request): 21 nnid = request.GET.get('nid') 22 models.UserInfo.objects.filter(nid=nnid).delete() 23 return redirect('/users') 24 def edit_user(request): 25 if request.method == 'GET': 26 nnid = request.GET.get('nid') 27 v = models.UserInfo.objects.filter(nid=nnid).first() 28 return render(request,'edit_user.html',{'obj':v}) 29 elif request.method == 'POST': 30 nnid = request.POST.get('nid') 31 u = request.POST.get('user') 32 p = request.POST.get('pwd') 33 a = request.POST.get('age') 34 models.UserInfo.objects.filter(nid=nnid).update(username=u,pwd=p,age=a) 35 return redirect('/users') 36 def edit_user_new(request,nnid): 若是是動態路徑,此處須要加參數,這個參數與路由系統中nnid所對應 37 if request.method == 'GET': 下面一部就不用獲取nid了,由於在路徑中已經獲取了。 38 v = models.UserInfo.objects.filter(nid=nnid).first() 39 return render(request,'edit_user_new.html',{'obj':v}) 40 elif request.method == 'POST': 41 u = request.POST.get('user') 42 p = request.POST.get('pwd') 43 a = request.POST.get('age') 44 models.UserInfo.objects.filter(nid=nnid).update(username=u, pwd=p, age=a) 45 return redirect('/users')
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>新編輯</h1> 9 <form action="/edit_user_new-{{ obj.nid }}.html" method="POST"> 因爲已經回去了nid,這樣就不用再次獲取nid,因此也不必隱藏了。 10 <input type="text" name="user" placeholder="用戶名" value="{{ obj.username }}" /> 11 <input type="text" name="pwd" placeholder="密碼" value="{{ obj.pwd }}" /> 12 <input type="text" name="age" placeholder="年齡" value="{{ obj.age}}" /> 13 <input type="submit" value="提交"> 14 15 </form> 16 17 18 </body> 19 </html>
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>用戶列表</h1> 9 <a href="/add_user">添加</a> 10 <ul> 11 {% for row in data %} 12 <li> 13 {{ row.nid}} - {{ row.username }} - 14 {{ row.pwd }}- {{ row.age }} - 15 <a href="/delete_user?nid={{ row.nid }}">刪除</a> - 16 <a href="/edit_user?nid={{ row.nid }}">編輯</a> - 17 <a href="/edit_user_new-{{ row.nid }}.html">新編輯</a> 18 </li> 19 {% endfor %} 20 </ul> 21 </body> 22 </html>
1.url(r'^edit_user_new-(\d+).html$', views.edit_user_new,name='bbb'),
{% url "bbb" 1 %} ==> edit_user_new-1.html 位置在相應html的form表單中的action
2. url(r'^edit_user_new-(?P<nnid>\d+).html$', views.edit_user_new, name='nnn'),
{% url "nnn" nnid=1 %} ==> edit_user_new-1.html
多個app時,防止urls出錯,各自寫在本身的urls中
導入include模塊
主urls
url(r'^A2/',include('A2.urls')),
url(r'^A3/',include('A3.urls')),
A2 urls
from django.conf.urls import url, include
from django.contrib import admin
from A2 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/', views.test),
]
A2 views
from django.shortcuts import render
from django.shortcuts import HttpResponse
# Create your views here.
def test(request):
return HttpResponse('A2.test')
A3 urls
from django.conf.urls import url, include
from django.contrib import admin
from A3 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/', views.test),
]
A3 views
from django.shortcuts import render
from django.shortcuts import HttpResponse
# Create your views here.
def test(request):
return HttpResponse('A3.test')
獲取請求信息:
request.POST {'username':'root'..} 對request.body的處理。
request.GET
request.FILES
request.method
request.body = username=root;age=18;gender=male
request.FILES實例
1 from django.conf.urls import url, include 2 from django.contrib import admin 3 from A2 import views 4 urlpatterns = [ 5 url(r'^admin/', admin.site.urls), 6 url(r'^test/', views.test), 7 url(r'^upload', views.upload), 8 9 ]
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <form action="/A2/upload" method="POST" enctype="multipart/form-data"> 9 <input type="file" name="fafafa" /> 10 <input type="submit" value="提交"> 11 </form> 12 13 </body> 14 </html>
1 from django.shortcuts import render 2 from django.shortcuts import HttpResponse 3 # Create your views here. 4 def test(request): 5 return HttpResponse('A2.test') 6 def upload(request): 7 if request.method == 'GET': 8 return render(request,'upload.html') 9 elif request.method == 'POST': 10 obj = request.FILES.get('fafafa') #獲取文件的方式 11 import os 12 f = open(os.path.join('upload',obj.name),'wb') 13 for line in obj.chunks(): #chunks是個迭代器 14 f.write(line) 15 f.close() 16 return HttpResponse('ok')
響應結果:
return HttpReponse(..)
return render(request,'path/a.html',{})
return redirect('http://www.baidu.com')
本質上就是作替換
特殊規則:
- 1
{{k1}} 獲取單值,
- 2
{% if a == 123 %}
{% else %}
{% endif %}
- 3
{% for item in LIST %}
{{item}}
{% endfor %}
- 4
# 索引:字典.k1 列表.1 只能是點,沒有相似於字典或者列表的那種取值方法
- 5.自定義模板方法
- filter: 在if條件中作條件時
- simple_tag: 在頁面僅顯示內容時
- 6. extends
- 模板的繼承
在基礎模板中留有繼承的位置,用{% block body %}和{% endblock %}所包含的內容替換基礎模板中{% block body %}和{% endblock %}的位置。
- 7. include
- 導入公共組件
方法:
urls
url(r'^tpl',views.tpl),
views
def tpl(request):
return render(request,'tpl.html',{'summary':'wewewewewewew'})
tpl.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ summary }}
<br/>
{{ summary | truncatechars:8 }}
</body>
</html>
自定義simple_tag
好比我想建立一個{{ summary | ji}}的方法
a、在app中建立templatetags模塊
b、建立任意 .py 文件,如:xx.py
url(r'^tpl',views.tpl),
1 from django import template 2 register = template.Library() 3 @register.filter 4 def ji(value): 5 return 'jijiji'
若是在文件中寫入value值,那麼ji前面的summary就會沒看成參數傳入進去
{{ summary | ji}}
@register.filter filter只能穿兩個值
def ji(value):
return 'jijiji----->' + value ,此時summary對應的值就會被傳進去,value就對應的是ji前面的summary
c、在使用自定義simple_tag的html文件中導入以前建立的 xx.py 文件名
若是是{{ summary | ji:8}},就表示能夠傳入兩個參數
def ji(value,num):
return 'jijiji----->' + value +str(num)
最多能加兩個參數
1 {% load xxoo %} 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title>Title</title> 7 </head> 8 <body> 9 {{ summary }} 10 <br/> 11 {{ summary | truncatechars:8 }} 12 <br/> 13 {{ summary | ji}} 14 </body> 15 </html>
d、使用simple_tag
e、在settings中配置當前app,否則django沒法找到自定義的simple_tag
from django.utils.safestring import mark_safe #導入這個模塊就是將tmp轉化爲html的格式
1 from django import template 2 register = template.Library() 3 from django.utils.safestring import mark_safe 4 @register.filter 5 def ji(value,num): 6 return 'jijiji----->' + value + str(num) 7 @register.filter 8 def ya(value,num): 9 #value就是跳轉 10 #num 就是8 11 tmp = "<a href='http://www.baidu.com?t=%s'>%s</a>" %(num,value,) 12 return mark_safe(tmp)
1 {% load xxoo %} 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title>Title</title> 7 </head> 8 <body> 9 {{ summary }} 10 <br/> 11 {{ summary | truncatechars:8 }} 12 <br/> 13 {{ summary | ji:8}} 14 <br/> 15 {{ '跳轉'| ya:8 }} 16 </body> 17 </html>
不一樣頁面,有相同的元素。
通常預留位置有3個,一個是內容,一個是css,一個是js。
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 <style> 7 body{ 8 margin: 0; 9 } 10 .pg-header{ 11 height: 48px; 12 background-color: green; 13 color: white; 14 } 15 .pg-body .menus{ 16 width: 20%; 17 float: left; 18 background-color: black; 19 height: 500px; 20 } 21 .pg-body .contents{ 22 width: 80%; 23 float: left; 24 } 25 </style> 26 {% block css %}{% endblock %} 27 </head> 28 <body> 29 <div class="pg-header"> 30 LLLLLLL 31 </div> 32 <div class="pg-body"> 33 <div class="menus"></div> 34 <div class="contents"> 35 {% block bd %}{% endblock %} 36 </div> 37 </div> 38 {% block js %}{% endblock %} 39 </body> 40 </html>
1 {% extends 'layout.html' %} 2 3 {% block css %} 4 <style> 5 6 </style> 7 {% endblock %} 8 9 {% block bd %} 10 <h1>組列表</h1> 11 ... 12 {% endblock %} 13 14 15 {% block js %} 16 <script></script> 17 {% endblock %}
引用那個內容,要寫相應的名字。
公共組件,好比有分頁,點下一頁,頁面變化,可是下面的分頁不變
寫入到另外一個頁面,經過include解決
1 <div> 2 <a>上一頁</a> 3 <a>1</a> 4 <a>2</a> 5 <a>3</a> 6 <a>4</a> 7 <a>下一頁</a> 8 </div>
1 {% extends 'layout.html' %} 2 3 {% block css %} 4 <style> 5 6 </style> 7 {% endblock %} 8 9 {% block bd %} 10 <h1>組列表</h1> 11 ... 12 {% include 'pager.html' %} 13 {% endblock %} 14 15 16 {% block js %} 17 <script></script> 18 {% endblock %}
- 是用戶瀏覽器上的一個鍵值對
- 設置超時時間
利用cookie可實現:
- 登陸驗證
-頁面顯示條數
- 拖動位置..
-顯示內容,能夠選擇顯示10條,20條.......
例子:
urls
url(r'^login$',views.login),
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <form action="/login" method="POST"> 9 <input type="text" name="user" /> 10 <input type="password" name="pwd" /> 11 <input type="submit" value="登錄" /> {{ msg }} 12 </form> 13 </body> 14 </html>
1 from django.shortcuts import render 2 from django.shortcuts import HttpResponse 3 from A1 import models 4 from django.shortcuts import redirect 5 # Create your views here. 6 def users(request): 7 #摸口袋,有能夠執行,沒有重定向到login頁面 8 v = request.COOKIES.get('user_name') 9 if not v: 10 return redirect('/login') 11 12 13 14 users_list = models.UserInfo.objects.all() 15 return render(request,'users.html',{'data':users_list}) 16 def add_user(request): 17 if request.method == 'GET': 18 return render(request,'add_user.html ') 19 elif request.method == 'POST': 20 u = request.POST.get('user') 21 p = request.POST.get('pwd') 22 a = request.POST.get('age') 23 # obj = models.UserInfo(username=u,pwd=p,age=a) 24 # obj.save() 25 models.UserInfo.objects.create(username=u,pwd=p,age=a) 26 return redirect('/users') 27 def delete_user(request): 28 nnid = request.GET.get('nid') 29 models.UserInfo.objects.filter(nid=nnid).delete() 30 return redirect('/users') 31 def edit_user(request): 32 if request.method == 'GET': 33 nnid = request.GET.get('nid') 34 v = models.UserInfo.objects.filter(nid=nnid).first() 35 return render(request,'edit_user.html',{'obj':v}) 36 elif request.method == 'POST': 37 nnid = request.POST.get('nid') 38 u = request.POST.get('user') 39 p = request.POST.get('pwd') 40 a = request.POST.get('age') 41 models.UserInfo.objects.filter(nid=nnid).update(username=u,pwd=p,age=a) 42 return redirect('/users') 43 def edit_user_new(request,nnid): 44 if request.method == 'GET': 45 v = models.UserInfo.objects.filter(nid=nnid).first() 46 return render(request,'edit_user_new.html',{'obj':v}) 47 elif request.method == 'POST': 48 u = request.POST.get('user') 49 p = request.POST.get('pwd') 50 a = request.POST.get('age') 51 models.UserInfo.objects.filter(nid=nnid).update(username=u, pwd=p, age=a) 52 return redirect('/users') 53 def tpl(request): 54 return render(request,'tpl.html',{'summary':'wewewewewewew'}) 55 56 def login(request): 57 if request.method == 'GET': 58 return render(request,'login.html') 59 elif request.method == 'POST': 60 u = request.POST.get('user') 61 p = request.POST.get('pwd') 62 obj = models.UserInfo.objects.filter(username=u,pwd=p).first() 63 if obj: 64 #在請求這口袋放東西 65 obj = redirect('/users') 66 obj.set_cookie(key='user_name',value=u,max_age=10,)#max_age 超時時間,expires當前時間,path,在那個url下生效,好比path=/index,只有index頁面過來才能生效,不寫默認是全局,httponly=True,http傳輸secure=True,https傳輸 67 68 return obj 69 else: 70 return render(request,'login.html',{'msg':'用戶名或密碼錯誤'})
兩大忌諱:
- 敏感信息
- 簡單
- 放置在服務器端的鍵值對
隨機字符串,雙方都有,用戶登錄時,會拿隨機字符串,但並不認爲登錄成功,要與本身服務器上的字符串進行比對。
session = { 'asdfasdfasd': {'username':'hailong'}, 'asdfasdfasdf': {username:'feinikesi'}, }
views會有變更
1 from django.shortcuts import render 2 from django.shortcuts import HttpResponse 3 from A1 import models 4 from django.shortcuts import redirect 5 # Create your views here. 6 def users(request): 7 #摸口袋,有能夠執行,沒有重定向到login頁面 8 # v = request.COOKIES.get('user_name') 9 v = request.session.get('user_name') 10 if not v: 11 return redirect('/login') 12 13 14 15 users_list = models.UserInfo.objects.all() 16 return render(request,'users.html',{'data':users_list}) 17 def add_user(request): 18 if request.method == 'GET': 19 return render(request,'add_user.html ') 20 elif request.method == 'POST': 21 u = request.POST.get('user') 22 p = request.POST.get('pwd') 23 a = request.POST.get('age') 24 # obj = models.UserInfo(username=u,pwd=p,age=a) 25 # obj.save() 26 models.UserInfo.objects.create(username=u,pwd=p,age=a) 27 return redirect('/users') 28 def delete_user(request): 29 nnid = request.GET.get('nid') 30 models.UserInfo.objects.filter(nid=nnid).delete() 31 return redirect('/users') 32 def edit_user(request): 33 if request.method == 'GET': 34 nnid = request.GET.get('nid') 35 v = models.UserInfo.objects.filter(nid=nnid).first() 36 return render(request,'edit_user.html',{'obj':v}) 37 elif request.method == 'POST': 38 nnid = request.POST.get('nid') 39 u = request.POST.get('user') 40 p = request.POST.get('pwd') 41 a = request.POST.get('age') 42 models.UserInfo.objects.filter(nid=nnid).update(username=u,pwd=p,age=a) 43 return redirect('/users') 44 def edit_user_new(request,nnid): 45 if request.method == 'GET': 46 v = models.UserInfo.objects.filter(nid=nnid).first() 47 return render(request,'edit_user_new.html',{'obj':v}) 48 elif request.method == 'POST': 49 u = request.POST.get('user') 50 p = request.POST.get('pwd') 51 a = request.POST.get('age') 52 models.UserInfo.objects.filter(nid=nnid).update(username=u, pwd=p, age=a) 53 return redirect('/users') 54 def tpl(request): 55 return render(request,'tpl.html',{'summary':'wewewewewewew'}) 56 57 def login(request): 58 if request.method == 'GET': 59 return render(request,'login.html') 60 elif request.method == 'POST': 61 u = request.POST.get('user') 62 p = request.POST.get('pwd') 63 obj = models.UserInfo.objects.filter(username=u,pwd=p).first() 64 if obj: 65 #在請求這口袋放東西 66 obj = redirect('/users') 67 # obj.set_cookie(key='user_name',value=u,max_age=10,)#max_age 超時時間,expires當前時間,path,在那個url下生效,好比path=/index,只有index頁面過來才能生效,不寫默認是全局,httponly=True,http傳輸secure=True,https傳輸 68 request.session['user_name'] = u 69 return obj 70 else: 71 return render(request,'login.html',{'msg':'用戶名或密碼錯誤'})
django的session字符串默認放在數據庫中
session的配置
Django中默認支持Session,其內部提供了5種類型的Session供開發者使用:
數據庫
1 Django默認支持Session,而且默認是將Session數據存儲在數據庫中,即:django_session 表中。 2 3 4 5 a. 配置 settings.py 6 7 8 9 SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認) 10 11 12 13 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認) 14 15 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認) 16 17 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認) 18 19 SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認) 20 21 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認) 22 23 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默認) 24 25 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過時(默認) 26 27 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改以後才保存(默認) 28 29 30 31 32 33 34 35 b. 使用 36 37 38 39 def index(request): 40 41 # 獲取、設置、刪除Session中數據 42 43 request.session['k1'] 44 45 request.session.get('k1',None) 46 47 request.session['k1'] = 123 48 49 request.session.setdefault('k1',123) # 存在則不設置 50 51 del request.session['k1'] 52 53 54 55 # 全部 鍵、值、鍵值對 56 57 request.session.keys() 58 59 request.session.values() 60 61 request.session.items() 62 63 request.session.iterkeys() 64 65 request.session.itervalues() 66 67 request.session.iteritems() 68 69 70 71 72 73 # 用戶session的隨機字符串 74 75 request.session.session_key 76 77 78 79 # 將全部Session失效日期小於當前日期的數據刪除 80 81 request.session.clear_expired() 82 83 84 85 # 檢查 用戶session的隨機字符串 在數據庫中是否 86 87 request.session.exists("session_key") 88 89 90 91 # 刪除當前用戶的全部Session數據 92 93 request.session.delete("session_key") 94 95 96 97 request.session.set_expiry(value) 98 99 * 若是value是個整數,session會在些秒數後失效。 100 101 * 若是value是個datatime或timedelta,session就會在這個時間後失效。 102 103 * 若是value是0,用戶關閉瀏覽器session就會失效。 104 105 * 若是value是None,session會依賴全局session失效策略。
緩存
1 a. 配置 settings.py 2 3 4 5 SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 6 7 SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認內存緩存,也能夠是memcache),此處別名依賴緩存的設置 8 9 10 11 12 13 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串 14 15 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑 16 17 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 18 19 SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie 20 21 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸 22 23 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) 24 25 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過時 26 27 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改以後才保存 28 29 30 31 32 33 34 35 b. 使用 36 37 38 39 同上
文件Session
1 a. 配置 settings.py 2 3 4 5 SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 6 7 SESSION_FILE_PATH = None # 緩存文件路徑,若是爲None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T 8 9 10 11 12 13 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串 14 15 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑 16 17 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 18 19 SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie 20 21 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸 22 23 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) 24 25 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過時 26 27 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改以後才保存 28 29 30 31 b. 使用 32 33 34 35 同上
緩存+數據庫Session
1 數據庫用於作持久化,緩存用於提升效率 2 3 4 5 a. 配置 settings.py 6 7 8 9 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 10 11 12 13 b. 使用 14 15 16 17 同上
加密cookie Session
1 a. 配置 settings.py 2 3 4 5 SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 6 7 8 9 b. 使用 10 11 12 13 同上