Django 千鋒培訓的學習筆記

1 . 創建項目
創建名爲project的項目命令

  django-admin startproject project
        注:所有路徑不要有中文

2. 目錄層級說明:

     manage.py  一個命令行工具,可以讓我們用多種方式對Django項目進行交互
     __init__.py 一個空文件,它告訴Python這個目錄應該被看做一個包
     settings.py 項目的配置文件(主要處理文件)
     urls.py     項目的url聲明 (主要處理文件)
     wsgi.py     項目與WSGI兼容的Web服務器入口

3. 配置數據庫
Django默認使用SQLite數據庫
在settings.py文件中通過DATABASES選項進行數據庫配置
配置MySQL
Python3.x中安裝的是PyMySQL
在__init__.py文件中寫入兩行代碼

import pymysql 
pymysql.install_as_MySQLdb()

以數據庫sunck爲例進行示範:對settings.py中的DATABASES進行設置

  DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': "sunck",
            'USER': "root",
            'PASSWORD': "admin123",
            'HOST': "localhost",
            'PORT': "3306"
        }
    }

4. 創建應用
在一個項目中可以創建多個應用,每個應用進行一種業務處理
在project(目錄名)的目錄下,輸入命令創建名爲myApp的app:

 python manage.py startapp myAPP

5. myAPP目錄說明
admin.py 進行站點配置
models.py 創建模型
views.py 創建視圖
6. 激活應用
在settings.py文件中,將myApp應用加入到INSTALLED_APPS選項中

INSTALLED_APPS = [
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
‘myApp’,
]
7. 定義模型
概述:有一個數據表就對應有一個模型
在models.py文件中定義模型

  from django.db import models
        模型類要繼承models.Model類
        示例:
 class Grades(models.Model):
 	gname = models.CharField(max_length=20)
    gdate = models.DateTimeField()
    ggirlnum = models.IntegerField()
    gboynum = models.IntegerField()
    isDelete = models.BooleanField(default=False)
 class Students(models.Model):
 	sname = models.CharField(max_length=20)
    sgender = models.BooleanField(default=True)
    sage = models.IntegerField()
    scontend = models.CharField(max_length=20)
    isDelete = models.BooleanField(default=False)
    sgrade = models.ForeignKey("Grades", on_delete=models.CASCADE,) # 關聯外建
        說明:
            不需要定義主鍵,在生成時自動添加,並且值爲自動增加

8. 在數據庫中生成數據表
生成遷移文件
執行 python manage.py makemigrations
在migrations目錄下生成一個遷移文件,此時數據庫中還沒有生成數據表
執行遷移
執行 python manage.py migrate
相當於執行MySQL語句創建了數據表

9. 測試數據操作
進入到python shell
執行 python manage.py shell
引入包

from myApp.models import Grades, Students
from django.utils import timezone
from datetime import *

10. 查詢所有數據

類名.objects.all()
示例: Grades.objects.all()

11. 添加數據
本質:創建一個模型類的對象實例

grade1 = Grades()
grade1.gname = "python04"
grade1.gdate = datetime(year=2017, month=7, day=17)
grade1.ggirlnum = 3
grade1.gboynum = 70
grade1.save()

12. 查看某個對象

類名.objects(pk=索引號)

示例:
Grades.objects.get(pk=2)
Grades.objects.all()

13. 修改某個數據
模型對象屬性 = 新值
示例:

grade2.gboynum = 60
grade2.save()

14. 刪除數據

模型對象.delete()
grade2.delete()
注意:這是物理刪除,數據庫中的相應數據被永久刪除

15. 關聯對象
示例:

stu = Students()
stu.sname = "Xue Yanmei"
stu.sgender = False
stu.sage = 20
stu.scontend = "I am Xue Yanmei"
stu.sgrade = grade1  #關聯班級  grade1 班級對象
stu.save()

16 獲得關聯對象的集合
需求:獵取python04班級的所有學生

 對象名.關聯的類名小寫_set.all()
 示例:grade1.students_set.all()

需求:創建曾志偉,屬於python04班級
示例:

  stu3 = grade1.students_set.create(sname=u'Zhen Zhiwei',sgender=True,scontend=u"I am Zhen Zhiwei",sage=45)
        注意:這樣創建的數據直接被添加到了數據庫當中。

17. 啓動服務器:
格式:python manage.py runserver ip:port
注意:ip可以不寫,不寫代表本機ip
端口號默認是8000
python manage.py runserver
說明:
這是一個純python編寫的輕量級web服務器,僅僅在開發測試中使用這個
Admin站點管理:
概述:
內容發佈:負責添加,修改,刪除內容的
公告訪問
18 配置Admin應用
在settings.py文件中的INSTALLED_APPS中添加’django.contrib.admin’,
這條默認是添加好的。
創建管理員用戶:
在項目目錄下執行 python manage.py createsuperuser
依次輸入賬號名,郵箱,密碼即可完成用戶創建
登陸:

 http://127.0.0.1:8000/admin/
漢化:
    把project\settings.py
    中作如下設定:
                 LANGUAGE_CODE = 'zh-Hans'
                 TIME_ZONE = 'Asia/Shanghai'

19 管理數據表
修改 myAPP\admin.py 如下:

 from django.contrib import admin
    # Register your models here.
    from .models import Grades, Students
    # 註冊
    admin.site.register(Grades)
    admin.site.register(Students)

20 自定義管理頁面
屬性說明
# 列表頁屬性
list_display = [] # 顯示字段設置
list_filter = [] # 過濾字段設置
search_fields = [] # 搜索字段設置
list_per_page = [] # 分頁設置
# 添加,修改頁屬性
fields = [] # 規定屬性的先後順序
fieldsets = [] # 給屬性分組 注意:fields與fieldsets不能同時使用
屬性示例:
# 列表頁屬性
list_display = [‘pk’, ‘gname’, ‘gdate’, ‘ggirlnum’, ‘gboynum’, ‘isDelete’]
list_filter = [‘gname’]
search_fields = [‘gname’]
list_per_page = 5
# 添加,修改頁屬性
# fields = [‘ggirlnum’, ‘gboynum’, ‘gname’, ‘gdate’, ‘isDelete’]
fieldsets = [
(“num”,{“fields”:[‘ggirlnum’, ‘gboynum’]}),
(“base”, {“fields”:[“gname”, “gdate”, “isDelete”]}),
]
關聯對象:需求:在創建一個班級時可以直接添加幾個學生
class StudentsInfo(admin.TabularInline):# 可選參數admin.StackedInline
model = Students
extra = 2
class GradesAdmin(admin.ModelAdmin):
inlines = [StudentsInfo]
布爾值顯示問題示例:
class StudentsAdmin(admin.ModelAdmin):
def gender(self):
if self.sgender:
return “男”
else:
return “女”
# 設置頁面列的名稱
gender.short_description = “性別”
list_display = [‘pk’, ‘sname’, ‘sage’, gender,
‘scontend’, ‘sgrade’, ‘isDelete’]
list_per_page = 10
admin.site.register(Students, StudentsAdmin)
執行按鈕位置:
class StudentsAdmin(admin.ModelAdmin):
…snip…
actions_on_top = False
actions_on_bottom = True
admin.site.register(Students, StudentsAdmin)
使用裝飾器完成註冊:
@admin.register(Students)
class StudentsAdmin(admin.ModelAdmin):
def gender(self):
…snip…
actions_on_top = False
actions_on_bottom = True
視圖的基本使用
概述:
在Django中,視圖是對web請求進行迴應
視圖就是一個python函數,在views.py文件中定義。
定義視圖:
示例:在myApp\views.py中寫入
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
def index(request):
return HttpResponse(“Sunck is a good man”)
配置url:方法一:path方法:
修改project目錄下的urls.py文件:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path(‘admin/’, admin.site.urls),
path(’’, include(‘myApp.urls’)),
]
在myApp應用目錄下創建urls.py文件:
from django.urls import path, include
from . import views
urlpatterns = [
path(’’,views.index),
]
配置url:方法二:url方法:
修改project目錄下的urls.py文件:
from django.contrib import admin
from django.conf.urls import url,include
urlpatterns = [
url(r’^admin/’, admin.site.urls),
url(r’^’, include(‘myApp.urls’)),
]
在myApp應用目錄下創建urls.py文件:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r’^KaTeX parse error: Undefined control sequence: \myApp at position 305: … 在templates\̲m̲y̲A̲p̲p̲\目錄下創建grades.ht…’, views.index),
url(r’^(\d+)/(\d+)KaTeX parse error: Undefined control sequence: \views at position 884: … 定義視圖:myApp\̲v̲i̲e̲w̲s̲.py …’, views.index),
url(r’^(\d+)/(\d+)$’, views.detail),
url(r’^grades/’, views.grades),
url(r’^students/’, views.students),
]
需求:點擊班級,顯示對應班級的學生名字
運行不正常https://www.bilibili.com/video/av17879644/?p=12

Django流程梳理
創建工程:執行 django-admin startproject 工程名
創建項目:執行 python manage.py startapp 項目名稱
激活項目:修改 settings.py中的INSTALLED_APPS
配置數據庫:
修改__init__.py文件
修改settings.py文件中的DATABASES
創建模型類:在項目目錄下的models.py文件中創建
生成遷移文件:執行python manage.py makemigrations
執行遷移:執行python manage.py migrate
配置站點:略
創建模板目錄/項目模板目錄
在settings.py中的TEMPLATES添加templates路徑
在工程目錄下(project)修改urls.py
在項目目錄下創建urls.py

使用他人Django代碼需要的簡易修改:
1.在settings.py中修改數據庫名
2.在settings.py中修改數據庫密碼
3.刪除由內向外文件(在對應目錄裏鼠標右鍵刪除)
4.在數據庫中創建對應第一步的數據庫(自己在SQL中創建)
5.執行生成遷移文件
6.執行遷移
7.啓動服務
8.瀏覽器測試

Django模型
Django對各種數據庫提供了很好的支持,Django爲這些數據庫提供了統一的調用API
我們可以根據不同的業務需求選擇不同的數據庫。
配置數據庫
修改工程目錄下的__init__.py文件
import pymysql
pymysql.install_ad_MySQLdb()
修改settings.py文件中的DATABASES
開發流程
配置數據庫
定義模型類:一個模型都在數據庫中對應一張數據庫表
生成遷移文件
執行遷移生成數據表
使用模型類進行增刪改查
ORM
概述:對象-關係-映射
任務:
根據對象的類型生成表結構
將對象,列表的操作轉換成SQL語句
將SQL語句查詢到的結果轉換爲對象,列表
優點:
極大的減輕了開發人員的工作量,不需要面對因數據庫的變更而修改代碼的問題
定義模型
模型,屬性,表,字段之間的關係
一個模型類在數據庫中對應一張表,在模型類中定義的屬性,對應該模型對照表中的一個字段
定義屬性:見下文
創建模型類
元選項
在模型類中定義Meta類,用於設置元信息
示例:
class Meta:
db_table = “students”
ordering = [‘id’]
db_table
定義數據表名,推薦用小寫字母,數據表名默認爲項目名小寫_類名小寫
ordering
對象的默認排序字段,獲取對象的列表時使用
示例:
ordering[‘id’] id按升序排列
ordering[’-id’] id按降序排列
注意:排序會增加數據庫開銷
模型成員
類屬性
隱藏類屬性objects:
是Manager類型的一個對象,作用是與數據庫進行交互
當定義模型類時沒有指定管理器,則Django爲模型創建一個名爲objects的管理器
自定義管理器示例:
定義stuObj管理器:
stuObj = models.Manager()
當爲模型指定模型管理器,Django就不再爲模型類生成objects模型管理器了。
自定義管理器Manager類
模型管理器是Django的模型進行與數據庫交互的窗口,一個模型可以有多個模型管理器
作用:
向管理器類中添加額外的方法
修改管理器返回的原始查詢集
通常會重寫get_queryset()方法
代碼示例:
class StudentsManager(models.Manager):
def get_queryset(self):
return super(StudentsManger, self).get_queryset().filter(isDelete=False)

                class Students(model.Moder):
                    # 自定義模型管理器
                    # 當自定義模型管理器,objects就不存在了
                    stuObj = models.Manger()
                    stuObj2 = StudentsManager()

    創建對象
        目的:向數據庫中添加數據
        當創建對象時,django不會對數據庫進行讀寫操作,當調用save()方法時才與數據庫交互,將對象保存在數據庫表中。
        注意:
            __init__方法已經在父類models.Model中使用,在自定義的模型中無法使用。
        方法:
            在模型類中增加一個類方法,示例如下:
                class Students(model.Moder):
                    ...snip...
                     @classmethod
                    def createStudent(cls, name, age, gender, contend,
                                      grade,lastT, createT, isD=False):
                        stu = cls(sname=name, sage=age, sgender=gender,
                                    scontend=contend, sgrade=grade, lastTime=lastT, createTime=createT,
                                    isDelete=isD)
                        return stu
            在自定義管理器中添加一個方法,示例如下:
                class StudentsManager(models.Manager):
                    def get_queryset(self):
                        return super(StudentsManager, self).get_queryset().filter(isDelete=False)
                    def createStudent(self, name, age, gender, contend, grade, lastT, createT, isD=False):
                        stu = self.model()
                        # print(type(grade))
                        stu.sname = name
                        stu.sage = age
                        stu.sgender = gender
                        stu.scontend = contend
                        stu.sgrade = grade
                        stu.lastTime = lastT
                        stu.createTime = createT
                        return stu
    模型查詢
        概述
            查詢集表示從數據庫獲取的對象的集合
            查詢集可以有多個過濾器
            過濾器就是一個函數,基於所給的參數限制查詢集結果
            從SQL角度來說,查詢集和select語句等價,過濾器就像where條件
        查詢集
            在管理器上調用過濾器方法返回查詢集
            查詢集經過過濾器篩選後返回新的查詢集,所以可以寫成鏈式調用
            惰性執行
                創建查詢集不會帶來任何數據庫的訪問,直到調用數據庫時,纔會訪問數據
            直接訪問數據的情況:
                迭代
                序列化
                與if合用
            返回查詢集的方法稱爲過濾器
                all():返回查詢集中的所有數據
                filter():保留符合條件的數據
                    filter(鍵=值)
                    filter(鍵=值,鍵=值)
                    filter(鍵=值).filter(鍵=值)   且的關係
                exclude():過濾掉符合條件的
                order_by():排序
                values():一條數據就是一個字典,返回一個列表
                get()
                    返回一個滿足條件的對象
                    注意:
                        如果沒有找到符合條件的對象,會引發模型類.DoesNotExist異常
                        如果找到多個對象,會引發模型類MultipleObjectsReturned異常
                count():返回查詢集中對象的個數
                first():返回查詢集中第一個對象
                last():返回查詢集中最後一個對象
                exits():判斷查詢集中是否有數據,如果有數據返回 True,否則返回 False.
            限制查詢集
                查詢集返回列表,可以使用下標的方法進行限制,等同於sql中的limit語句
                注意:下標不能是負數
                示例:studentsList = Students.stuObj2.all()[0:5]
            查詢集的緩存
                概述:
                    每個查詢集都包含一個緩存,來最小化對數據庫的訪問
                    在新建的查詢集中,緩存首次爲空,第一次對查詢集求值,會發生數據緩存,Django會將查詢出來的數據做一個緩存,並返回查詢結果。
                    以後的查詢直接使用查詢集的緩存
            字段查詢
                概述
                    實現了sql中的where語句,作爲方法filter(),exclude(),get()的參數
                    語法:屬性名稱__比較運算符=值
                    外鍵:屬性名稱_id
                    轉義:類似sql中的like語句
                         like有關情況看我哥他%是爲了匹配點位,匹配數據中的%使用(where like "\%")
                         filter(sname__contains="%")
                比較運算符
                    exact:判斷,大小寫敏感
                        filter(isDelete=False)
                    contains:是否包含,大小寫敏感
                        studentsList = Students.stuObj2.filter(sname__contains="孫")
                    startswith,endswith:以value開頭或結尾,大小寫敏感
                    以上四個在前面加上i,就表示不區分大小寫iexact,icontains,istartswith,iendswith
                    isnull,isnotnull
                        是否爲空
                        filter(sname__isnull=False)
                    in:是否包含在範圍內
                    gt大於,gte大於等於,lt小於,lte小於等於
                    year,month,day,week_day,hour,minute,second
                        studentsList = Students.stuObj2.filter(lastTime__year=2017)
                    跨關聯查詢
                        處理join查詢
                            語法:
                                模型類名__屬性名__比較運算符
                                # 描述中帶有‘薛延美’這三個字的數據是屬於哪個班級的
                                grade = Grades.objects.filter(students__scontend__contains='薛延美')
                                print(grade)
                        查詢快捷pk代表的主鍵
                    聚合函數
                        使用aggregate函數返回聚合函數的值
                        Avg
                        Count
                        Max
                            maxAge = Student.stuObj2.aggregate(Max('sage'))
                            maxAge爲最大的sage。
                        Min
                        Sum
                    F對象
                        可以使用模型的A屬性與B屬性進行比較
                        from django.db.models import F,Q
                        def grades1(request):
                            g = Grades.objects.filter(ggirlnum__gt=F('gboynum'))
                            print(g)
                            # [<Grades: python02>,<Grades: python03>]
                            return HttpResponse("OOOOOOOo")
                        支持F對象的算術運算
                            g = Grades.objects.filter(ggirlnum__gt=F('gboynum')+20)
                    Q對象
                        概述:過濾器的方法的關鍵字參數,條件爲And模式
                        需求:進行or查詢
                        解決:使用Q對象
                            def students4(request):
                                studentsList = Students.stuObj2.filter(Q(pk__lte=3) | Q(sage__gt=50))
                                return render(request, 'myApp/students.html', {"students": studentsList})
                            只有一個Q對象的時候,就是用於正常匹配條件
                            studentsList = Students.stuObj2.filter(~Q(pk__lte=3))
                            ~Q是取反

定義屬性
概述:
django根據屬性的類型確定以下信息
當前選擇的數據庫支持字段的類型
渲染管理表單時使用的默認html控件
在管理站點最低限度的驗證

    django會爲表增加自動增長的主鍵列,每個模型只能有一個主鍵列,如
    果使用選項設置某屬性爲主鍵列後,則django不會再生成默認的主鍵列

    屬性命名限制
        遵循標識符規則,且變量不能與Python保留字相同
        由於django的查詢方式,不允許使用連續的下劃線

庫
    定義屬性時,需要字段類型,字段類型被定義在django.db.models.fields目錄下,
    爲了方便使用,被導入到django.db.models中

    使用方式
        導入: from django.db import models
        通過 models.Field創建字段類型的對象,賦值給屬性

邏輯刪除
    對於重要類型都做邏輯刪除,不做物理刪除,實現方法是定義idDelete屬性,
    類型爲BooleanField,默認值爲False

字段類型
    autoField
        一個根據實際ID自動增長的IntegerField,通常不指定,
        如果不指定,一個主鍵字段將自動添加到模型中

    CharField(max_length=字符長度)
        字符串,默認的表彰樣式是TextInput

    TextField
        大文本字段,一般超過4000時使用,默認的表單控件是Textarea

    IntegerField
        整數

    DecimalField(max_digits=None, decimal_places=None)
        使用Python的Decimal實例表示的十進制浮點數
        參數說明
            DecimalField.max_digits
                位數總數
            DecimalField.decimal_places
                小數點後的數字位置

    FloatField
        使用Python的float實例來表示的浮點數

    BooleanField
        True/False 字段,此字段的默認表彰控制是CheckboxInput

    NullBooleanField
        支持 Null, True, False 三種值

    DateField([auto_now=False, auto_now_add=False])
        使用Python的datetime.date實例表示的日期
        參數說明:
            DateField.auto_now
                每次保存對象時,自動設置該字段爲當前時間,用於“最後一次修改”
                的時間戳,它總是使用當前日期,默認爲 False
            DateField.auto_now_add
                當前對象第一次被創建時自動設置當前時間,用於創建的時間戳,
                它總是使用當前日期,默認爲 False
        說明
            該字段默認對應的表單控件是一個TextInput.在管理員站點添加了一個
            JavaScript寫的日曆控件,和一個“Today”的快捷按鈕,包含了一個額外
            的invalid_date錯誤消息鍵
        注意
            auto_now_add, auto_now, and default 這些設置是相互排斥的,他們之間
            的任何組合將會發生錯誤的結果

    TimeField
        使用Python的datetime.time實例表示的時間,參數同DateField

    DateTimeField
        使用Python的datetime
        datetime實例表示的日期和時間,參數同DateField

    FileField
        一個上傳文件的字段

    ImageField
        繼承了FileField的所有屬性和方法,但對上傳的對象進行校驗,
        確保它是一個有效的image

字段選項
    概述
        通過字段選項,可以實現對字段的約束
        在字段對象中通過關鍵字參數指定

    null
        如果爲True,Django將空值以NULL存儲在數據庫中,默認值爲 False

    blanke
        如果爲True,則該字段允許爲空白,默認值爲 False

    注意
        null是數據庫範疇的概念,blank是表彰驗證範疇的概念

    db_column
        字段的名稱,如果未指定,則使用屬性的名稱

    db_index
        若值爲 True,則在表中會爲此字段創建索引

    default
        默認值

    primary_key
        若爲 True,則該字段會成爲模型的主鍵字段

    unique
        如果爲 True,這個字段在表中必須有唯一值

關係
    分類
        ForeignKey:一對多,將字段定義在多的端中
        ManyToManyField:多對多,將字段定義在兩端中
        OneToOneField:一對一,將字段定義在任意一端中

    用一訪問多
        格式
            對象.模型類小寫_set
        示例
            grade.students_set

    用一訪問一
        格式
            對象.模型類小寫
        示例
            grade.studnets

    訪問id
        格式
            對象.屬性_id
        示例
            student.sgrade_id

視圖
概述:
作用:視圖接收web請求,並響應web請求
本質:視圖就是python中的一個函數
響應:
響應過程:
用戶在瀏覽器中輸入網址www.sunck.wang/sunck/index.html
—網址—>
django獲取網址信息,去掉IP與端口號,網址變成:sunck/index.html
—虛擬路徑與文件名—>
url管理器逐個匹配urlconf,記錄視圖函數
—視圖函數名—>
視圖管理,找到對應的視圖去執行,返回結果給瀏覽器
—響應的數據—>
返回第一步:用戶在瀏覽器中輸入網址
網頁
重定向
錯誤視圖
404視圖:找不到網頁(url匹配不成功時返回)時返回
在templates目錄下定義404.html
<!doctype html>





Document


頁面丟失


{{request_path}}




request_path:導致錯誤的網址
配置settings.py
DEBUG
如果爲 True,永遠不會調用404頁面,需要調整爲 False 纔會顯示
ALLOWED_HOSTS = [’*’]
500視圖:在視圖代碼中出現錯誤(服務器代碼錯誤)
400視圖:錯誤出現在客戶的操作
JSON數據
url配置
配置流程:
制定根級url配置文件
settings.py文件中的ROOT_URLCONF
ROOT_URLCONF = ‘project.urls’
默認實現了
urlpatterns
一個url實例的列表
url對象
正則表達式
視圖名稱
名稱
url匹配正則的注意事項
如果想要從url中獲取一個值,需要對正則加小括號
匹配正則前方不需要加’/’
正則前需要加’r’表示字符串不轉義
引入其他url配置
在應用中創建urls.py文件,定義本應用的url配置,在工程urls.py中使用include方法
project\urls.py
from django.contrib import admin
from django.conf.urls import url,include
urlpatterns = [
url(r’^admin/’, admin.site.urls),
url(r’^’, include(‘myApp.urls’, namespace=“myAPP”)),
]
myApp\urls.py
from django.urls import path, include
from django.conf.urls import url
from . import views
urlpatterns = [
url(r’^KaTeX parse error: Expected 'EOF', got '&' at position 1055: …ck.wang/abc?a=1&̲b=2&c=3 …,否則無法匹配
views.py
def get1(request):
a = request.GET.get(‘a’)
b = request.GET.get(‘b’)
c = request.GET.get(‘c’)
return HttpResponse(a + " " + b + " " + c)

        www.sunck.wang/abc?a=1&a=2&c=3
        urls.py
        url(r'^get2', views.get2),
        views.py
        def get2(request):
            a = request.GET.getlist('a')
            a1 = a[0]
            a2 = a[1]
            c = request.GET.get('c')
            return HttpResponse(a1 + " " + a2 + " " + c)
    POST屬性
        使用表單模擬POST請求
        關閉CSRF:project\project\settings.py
            MIDDLEWARE = [
                'django.middleware.security.SecurityMiddleware',
                'django.contrib.sessions.middleware.SessionMiddleware',
                'django.middleware.common.CommonMiddleware',
                # 'django.middleware.csrf.CsrfViewMiddleware',
                'django.contrib.auth.middleware.AuthenticationMiddleware',
                'django.contrib.messages.middleware.MessageMiddleware',
                'django.middleware.clickjacking.XFrameOptionsMiddleware',
            ]
        示例:
            def showregist(request):
                return render(request, 'myApp/regist.html',)

            def regist(request):
                name = request.POST.get("name")
                gender = request.POST.get("gender")
                age = request.POST.get("age")
                hobby = request.POST.getlist("hobby")
                print(name)
                print(gender)
                print(age)
                print(hobby)
                return HttpResponse("regist")
        路徑:
            url(r'^showregist/$', views.showregist),
                url(r'^showregist/regist/$', views.regist),
        頁面:
               <!doctype html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <meta name="viewport"
                      content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
                <meta http-equiv="X-UA-Compatible" content="ie=edge">
                <title>註冊</title>
            </head>
            <body>
                <form action="regist/" method="post">
                    姓名:<input type="text" name="name" value=""/>
                    <hr>
                    性別:<input type="radio" name="gender" value="1">男<input type="radio" name="gender" value="0">女
                    <hr>
                    愛好:<input type="checkbox" name="hobby" value="power"/>權利<input type="checkbox" name="hobby" value="money">金錢<input type="checkbox" name="hobby" value="beauty">美女<input type="checkbox" name="hobby" value="Tesla">Tesla
                    <hr>
                    <input type="submit" value="註冊">
                </form>
            </body>
            </html>
HttpResponse對象
    概述:
        作用:給瀏覽器返回數據
        HttpRequest對象是由Django創建的,HttpResponse對象是由程序員創建
    用法:
        不用模板,直接返回數據
            語句示例:return HttpResponse("Sunck is a good man")
        調用模板
            使用render方法
                原型:render(request, templateName[, context])
                作用:結合數據和模板,返回一個完整的HTML頁面
                參數:
                    request:請求體對象
                    templateName:模板路徑
                    context:傳遞給需要渲染在模板上的數據
    屬性
        content:表示返回內容
        charset:編碼格式
        status_code:響應狀態碼
            200
            304
            404
            400
        content-type:指定輸出的MIME類型
    方法
        init:使用頁面內容實例化HttpResponse對象
        write(content):以文件的形式寫入
        flush():以文件的形式輸出緩衝區
        set_cookie(key, value, maxAge=None, exprise=None)
        delete_cookie(key):
            刪除cookie
            如果刪除一個不存在的cookie,就當什麼都沒發生
    子類HttpResponseRedirect
        功能:重定向,服務器端的跳轉
        簡寫
            redirect(to)
        to推薦使用反向解析
        示例:
            from django.http import HttpResponseRedirect
            from django.shortcuts import redirect
            def redirect1(request):
                # return HttpResponseRedirect('/redirect2')
                return redirect('/redirect2')
            def redirect2(request):
                return HttpResponse("我是重定向後的視圖")
    子類JsonResponse
        返回Json數據,一般用於異步請求
        __init__(self.data)
        data 字典
        注意:Content-type類型爲application/json
狀態保持
    http協議是無狀態的,每次請求都是一次新的請求,它不記得之前的請求。
    客戶端與服務器的一次通信就是一次會話
    實現狀態的保持,在客戶端或服務端存儲有關會話的數據
    存儲的方式
        cookie:所有數據存儲在客戶端,不要存儲敏感的數據
        session:所有的數據存儲在服務端,在客戶端用cookie存儲session_id
    狀態保持的目的:
        在一段時間內跟蹤請求者的狀態,可以實現跨頁面訪問當前的請求者的數據
    注意:不同的請求者之間不會共享這個數據,與請求者一一對應
    啓用session:project\project\settings.py
        INSTALLED_APPS    'django.contrib.sessions',
        MIDDLEWARE    'django.contrib.sessions.middleware.SessionMiddleware',
    使用session
        啓用session後,每個httpRequest對象都有一個session屬性
        get[key, default=None]    根據鍵獲取session值
        clear()    清空所有會話
        flush()    刪除當前會話並刪除會話的cookie
        示例:
            # session
            def main(request):
                # 取session
                username = request.session.get('name', '遊客')
                print(username)
                return render(request, 'myApp/main.html', {'username': username})

            def login(request):
                return render(request, 'myApp/login.html')

            def showmain(request):
                print("*****************")
                username = request.POST.get('username')
                # 存儲session
                request.session['name'] = username
                return redirect('/main/')

            from django.contrib.auth import logout
            def quit(request):
                # 清除session
                logout(request) # 方法1,推薦
                # request.session.clear() # 方法2
                request.session.flush() # 方法3
                return redirect('/main/')
    設置session過期時間
        set_expiry(value)
        request.session.set_expiry(10)  設置爲10秒後過期
        如果不設置,2個星期後過期
        value設置爲0代表關閉瀏覽器時過期
        value設置爲None代表設置永不過期,不推薦
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章