python之路-Django

安裝

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.18001/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.18001/index/
42         else:
43             return render(request,'login.html')
Views的配置
 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>
index的配置

靜態文件的設置

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})
views
 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>
users.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')
views
 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>
add_users.html
urls
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^users', views.users),
    url(r'^add_user',views.add_user),
]
urls

添加按鈕,須要跳轉,經過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時,獲取的是列表
views
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 ]
urls
 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 ]
urls
 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')
views
 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>
edit_user.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>
添加編輯按鈕

寫urls時,經過正則表達式來實現動態的路由系統

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 ]
urls

注意:若是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')
views
 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>
edit_user_new.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

url的分發

多個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')

 

視圖函數 views.py    

獲取請求信息:        

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 ]
urls
 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>
upload.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')
views

 響應結果:        

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
- 導入公共組件
       

方法:

  • {{ item.event_start|date:"Y-m-d H:i:s"}}  將日期格式變爲引號中的格式。
  • {{ bio|truncatewords:"30" }}                   截取前30個單詞

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'
xxoo.py

若是在文件中寫入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>
tpl.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)
xxoo.py
 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>
tpl.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 %}
include導入

Cookie 

- 是用戶瀏覽器上的一個鍵值對        

- 設置超時時間        

利用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>
login.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':'用戶名或密碼錯誤'})
views

 

   

兩大忌諱:   

      - 敏感信息   

      - 簡單

Session    

- 放置在服務器端的鍵值對    

隨機字符串,雙方都有,用戶登錄時,會拿隨機字符串,但並不認爲登錄成功,要與本身服務器上的字符串進行比對。    

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':'用戶名或密碼錯誤'})
session views

django的session字符串默認放在數據庫中

session的配置

Django中默認支持Session,其內部提供了5種類型的Session供開發者使用:

  • 數據庫(默認)
  • 緩存
  • 文件
  • 緩存+數據庫
  • 加密cookie

數據庫

  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失效策略。
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     同上
View Code

文件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     同上
View Code

緩存+數據庫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     同上
View Code

加密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     同上
View Code
相關文章
相關標籤/搜索