本周的學(xué)習(xí)內(nèi)容以Django為核心進(jìn)行展開拗军,包括項目創(chuàng)建钦奋、模塊創(chuàng)建、變量配置袒炉、模型構(gòu)造旁理、數(shù)據(jù)庫連接、頁面呈現(xiàn)等方面我磁,具體內(nèi)容如下所示:
1孽文、Django簡介
Django是一個開放源代碼的Web應(yīng)用框架驻襟,由Python寫成。采用了MTV的框架模式芋哭,即模型M沉衣,模板T和視圖V。它最初是被開發(fā)來用于管理勞倫斯出版集團旗下的一些以新聞內(nèi)容為主的網(wǎng)站的减牺,即是CMS(內(nèi)容管理系統(tǒng))軟件豌习。并于2005年7月在BSD許可證下發(fā)布。這套框架是以比利時的吉普賽爵士吉他手Django Reinhardt來命名的拔疚。
2斑鸦、兩種框架模式:
1)MVC(核心-->解耦,強制性的使應(yīng)用程序的輸入草雕,處理和輸出分開巷屿,減少各個模塊之間的耦合性,方便變更墩虹,更容易重構(gòu)代碼嘱巾,最大程度地實現(xiàn)了代碼的復(fù)用):
M:Model --> 進(jìn)行業(yè)務(wù)邏輯判斷,數(shù)據(jù)庫存冉氲觥(數(shù)據(jù)存取層旬昭,主要負(fù)責(zé)數(shù)據(jù)庫的CRUD)
V:View --> 根據(jù)業(yè)務(wù)邏輯選擇不同的視圖(表現(xiàn)層)
C:Controller--> 將用戶輸入的指令和數(shù)據(jù)傳遞給業(yè)務(wù)模型(業(yè)務(wù)邏輯層,主要負(fù)責(zé)業(yè)務(wù)邏輯的處理)
2)MTV(Django遵循的框架模式):
M:Model --> 負(fù)責(zé)業(yè)務(wù)與數(shù)據(jù)庫的CRUD
T:Template --> 負(fù)責(zé)把渲染的頁面展示給用戶
V:View --> 負(fù)責(zé)業(yè)務(wù)邏輯并適當(dāng)調(diào)用Model和Template(主要負(fù)責(zé)業(yè)務(wù)邏輯的處理)
注意:Django中還有一個url分發(fā)器菌湃,也叫作路由问拘。主要用于將url請求發(fā)送給不同的View 處理,View再進(jìn)行相關(guān)的業(yè)務(wù)邏輯處理
3惧所、Django的常規(guī)操作
1)pip install virtualenv: 安裝virtualenv(虛擬環(huán)境)(注:創(chuàng)建pycharm項目時需要指定虛擬環(huán)境骤坐,可以將不同版本的項目隔離開來,項目上線時要將環(huán)境和項目分離開)
2)pip install django==1.11: 安裝django環(huán)境
3)virtualenv --no-site-packages -p xxx 文件名: 安裝env環(huán)境下愈。xxx --> 指定python版本所在的路徑 or virtualenv --no-site-packages 文件名:安裝env環(huán)境纽绍。使用默認(rèn)版本的python解釋器(注: --no-site-packages:純凈的虛擬環(huán)境,不包括外界的包/模塊)
4)windows:
cd 環(huán)境名/Script --> activate | deactivate: 進(jìn)入|退出env
Linux:
source bin/activate 進(jìn)入
source deactivate 退出
5)django-admin startproject 項目名: 創(chuàng)建django項目
6)python manage.py startapp hello_app: 創(chuàng)建app(模塊)势似。該命令是在工程下創(chuàng)建一個名為hello_app的app
app(模塊內(nèi)部文件簡介):
init.py: 初始化拌夏,配置pymysql連接的地方
setting.py: 配置信息位置,databases等
urls.py: url路由履因,給每個請求尋找對應(yīng)的方法
wsgi.py: 網(wǎng)關(guān)
admin.py: 管理后臺注冊模型
apps.py: settings.py里面注冊app的時候需要使用到障簿,一般不推薦直接使用
models.py:寫模型的地方,定義數(shù)據(jù)庫中的表結(jié)構(gòu)
views.py:寫處理業(yè)務(wù)邏輯的地方
7)settings
7.1)在settings.py文件中INSTALLED_APPS中寫入創(chuàng)建的app的name or 導(dǎo)入apps.py文件中的APPCONFIG下的name屬性
7.2)修改databases
7.3)修改templates -- os.path.join(BASE_DIR, 'templates')
7.4)設(shè)置語言 -- LANGUAGE_CODE = 'zh-hans'
7.5)修改時區(qū) -- TIME_ZONE = 'Asia/Shanghai'
7.6)注釋MIDDLEWARE中的'django.middleware.csrf.CsrfViewMiddleware'在
8)建立模型(位置:app.models.py)
定義的模型繼承于models.Model
db_tables: 定義數(shù)據(jù)庫中的表名稱
模型字段:
CharField: 字符串
max_length: 最大長度
IntegerField: 整數(shù)
FloatField: 浮點數(shù)
BooleanField: 布爾類型(1,0)
DateField(auto_now_add=True/auto_now=True): 存放日期(年月日)
auto_now_add=True:第一次創(chuàng)建數(shù)據(jù)時設(shè)置時間(1次)
auto_now=True:每次登錄栅迄、修改操作都會更新到最新時間(多次)
DateTimeField:年月日 時分秒
auto_now_add:同上
auto_now:同上
AutoField: 自動增長
DecimalField:
models.DecimalField(max_digits=3,decimal_places=1) 最大值99.9
max_digits: 總位數(shù)
decimal_places: 小數(shù)點后的位數(shù)
TextField: 存長文本信息站故,頁面等
FileField: 文件上傳字段
ImageField(upload_to=''): 上傳圖片
upload_to="":指定上傳圖片的路徑
模型參數(shù):
default='xxx':設(shè)置默認(rèn)值
null=True: 設(shè)置是否為空,針對數(shù)據(jù)庫中該字段是否可以為空
blank=True:設(shè)置是否為空霞篡,針對表單提交中該字段是否可以為空
primary_key=True:創(chuàng)建主鍵
unique:唯一
9)加載數(shù)據(jù)庫(位置:project.init.py)
import pymysql
pymysql.install_as_MySQLdb():當(dāng)成是mysqldb一樣使用世蔗,當(dāng)然也可以不寫這句端逼,那就按照pymysql的方式
10)數(shù)據(jù)庫遷移
python manage.py makemigrations
python manage.py migrate
python manage.py makemigrations stu:強制找到stu模塊進(jìn)行遷移
Navicat中指定數(shù)據(jù)庫中的表django_migrations記錄了所有遷移記錄
11)啟動項目
python manage.py runserver ip:端口號(默認(rèn)8000端口):啟動django項目朗兵,端口號可以不用寫污淋,啟動的時候會默認(rèn)隨機創(chuàng)建一個可以使用的端口
12)(*暫時可有可無)創(chuàng)建超級管理員的帳號和密碼
python manage.py createsuperuser
4、Django過濾:
1)修改字段名
alter table table_name change 原名稱 修改后名稱 類型
2)objects對象
通過模型.objects來實現(xiàn)數(shù)據(jù)的增刪查改(CRUD)操作
3)獲取所有學(xué)生信息
select * from stu
模型.objects.all()
4)獲取所有女生的信息
select * from stu where stu_sex=False
模型.objects.filter(stu_sex=False)[.fisrt():返回第一條數(shù)據(jù) / .last():返回最后一條數(shù)據(jù) / .count():求和]
模型.objects.get(stu_sex=False)(只能獲取一條數(shù)據(jù)不推薦使用)
5)F()/ Q()
from django.db.models import F,Q
5余掖、關(guān)聯(lián)
1:1 OneToOneField: 主鍵和外鍵是一對一關(guān)系寸爆,在關(guān)聯(lián)表中,只能關(guān)聯(lián)一個主表的id (一般添加到擴展表盐欺,關(guān)聯(lián)到主表)
拓展表找主表:拓展信息對象.關(guān)聯(lián)字段
主表找拓展表:主表對象.關(guān)聯(lián)表的model_name
1:N OneToManyField
N:N MangToManyField
on_delete=xxx:刪除主表的時候赁豆,從表的狀態(tài)
models.CASCADE:級聯(lián)關(guān)系,主表刪除冗美,從表也刪除(默認(rèn))
models.SET_NULL:主表刪除魔种,從表關(guān)聯(lián)字段設(shè)置為空
models.PROTECT:不能刪除主表
models.SET_DEFAULT:主表刪除,從表關(guān)聯(lián)字段設(shè)置為默認(rèn)值
6粉洼、前端操作
過濾器(|):在變量顯示前修改
example: 語文成績:{{stu.stu_chinese | add:10}} -- add:加法节预,增加值
時間
date:(在數(shù)據(jù)庫中時間會比頁面顯示中少8個小時,操作時需要注意)
Y-完整年份(四位年) m:月
y-簡寫年份(兩位年) n:日
H-時 24小時制 m:分
h-時 12小時制 s:秒
example: 創(chuàng)建時間:{{ stu.stu_create_time | date:'Y-m-d H:m:s' }}
注釋
{# #}:單行注釋
{% comment %}{% endcommet %}:多行注釋
大小寫
upper | lower
example : 姓名:{{ stu.stu_name | upper}} <!-- upper/lower:大小寫轉(zhuǎn)換 -->
分?jǐn)?shù)乘法運算
widthratio 數(shù) 分母 分子
example:語文成績乘以10:{% widthratio stu.stu_chinese 1 10 %}
<!-- stu.stu_chinese * 10(分子) / 1(分母)-->
整除運算
divisibleby:2 整除2属韧,返回True,否則返回False
example:數(shù)學(xué)成績:{{ stu.stu_math | divisibleby:2}}
<!-- 判斷數(shù)學(xué)成績是否能整除2 -->
命名空間
{% url 'namespace:name' value %}
工程url中定義namespace
模塊url中定義name
靜態(tài)資源加載
1)<img src="/static/images/xxx.png">
2) {% load static %}
<img src="{% static 'images/enemy1.png' %}">
for:
{% for stu in stus %}
{% empty %} # for中內(nèi)容為空時執(zhí)行的操作
{% endfor %}
if:
{% if xxx %}
{% else %}
{% endif %}
ifequal: # 如果相等時的操作
{% ifequal xxx 1 %}
{% else %}
{% endifequal %}
forloop
計數(shù)從0開始: {{ forloop.counter0 }}
計數(shù)從1開始: {{ forloop.counter }}
計數(shù)從最后開始安拟,到1停: {{ forloop.revcounter }}
計數(shù)從最后開始,到0停: {{ forloop.revcounter0 }}
7宵喂、REQUEST處理
post -- 提交數(shù)據(jù)隱藏了
get -- 提交數(shù)據(jù)在url上, ?后跟參數(shù)糠赦,&用來連接多個參數(shù),但是對參數(shù)的數(shù)量有限制锅棕,每個瀏覽器的限制不同
put 更新全部數(shù)據(jù)
patch 更新局部數(shù)據(jù)
delete:刪除數(shù)據(jù)
example: stu_id = request.GET.get('stu_id')
Student.objects.filter(id=stu_id).delete()
8拙泽、COOKIE
cookie: 隨著url移動,在瀏覽器
session: 在數(shù)據(jù)庫
set_cookie(key,value,seconds): 設(shè)置cookie裸燎,并為其綁定令牌奔滑,令牌有過期時間,可以設(shè)置并存放在mysql或mongodb
1)綁定令牌到cookie里面顺少,并將cookie存在前端
ticket = 'lalala'
response = HttpResponse()
response.set_cookie('ticket',ticket)
return response
2)cookie存在數(shù)據(jù)庫中
user.u_ticket = ticket
user.save()
del_cookie(): 刪除cookie
常見問題見解:
1)同一個瀏覽器登錄兩個qq空間朋其,內(nèi)容會互串 --> 原因:瀏覽器只能就一個應(yīng)用程序保存一個cookie,即后登陸的空間的cookie,再訪問的便是后登陸空間的內(nèi)容
2)cookie中是否有權(quán)限:cookie只是用于保存專屬于一個特定用戶的令牌脆炎,將每個用戶分隔開來梅猿,用于和數(shù)據(jù)庫端的令牌進(jìn)行比對成功后進(jìn)行后續(xù)操作而無需再輸入帳號密碼(一般cookie有生存時間,超時cookie將被刪除秒裕,則需要重新登錄袱蚓,類似于淘寶、天貓長時間不操作便會要求重新登錄),至于權(quán)限几蜻,數(shù)據(jù)庫中應(yīng)當(dāng)專門存儲權(quán)限表喇潘,并和指定用戶關(guān)聯(lián)
3)cookie加密:不用体斩,明碼傳輸即可,一個人創(chuàng)建的令牌叫ticket颖低,則另一個人創(chuàng)建的令牌則可能叫session
9絮吵、科普知識
1) Jinja2 --> Python下一個被廣泛應(yīng)用的模版引擎,他的設(shè)計思想來源于Django的模板引擎忱屑,并擴展了其語法和一系列強大的功能蹬敲。其中最顯著的一個是增加了沙箱執(zhí)行功能和可選的自動轉(zhuǎn)義功能,這對大多應(yīng)用的安全性來說是非常重要的莺戒。它基于unicode并能在python2.4之后的版本運行伴嗡,包括python3
2)QueryDict和dict的區(qū)別 --> QueryDict定義在django.http.QueryDict,request對象的屬性GET、POST都是QueryDict類型的對象,與python字典(dict)不同从铲,QueryDict類型的對象用來處理同一個鍵帶有多個值的情況
3)ORM(objects relational mapping): 對象關(guān)系映射瘪校,翻譯機
4)alt + enter: 提示當(dāng)前應(yīng)用的函數(shù)所需要導(dǎo)入的包
5)path: 查看PATH路徑中的內(nèi)容
通過本周的理論知識學(xué)習(xí)及實際應(yīng)用項目的操練,筆者在一定程度上理解了MTV框架模式的原理名段,Django項目的設(shè)計流程阱扬,網(wǎng)站前后端交互的過程等,為后續(xù)基于Django的整站開發(fā)打下了基礎(chǔ)吉嫩,后續(xù)階段需要進(jìn)一步將css价认,html等內(nèi)容融入到django項目中,使項目更加豐富自娩、完整