Python學(xué)習(xí)周總結(jié)(18.04.23 - 04.27)

    本周的學(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項目中,使項目更加豐富自娩、完整
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末用踩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子忙迁,更是在濱河造成了極大的恐慌脐彩,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姊扔,死亡現(xiàn)場離奇詭異惠奸,居然都是意外死亡,警方通過查閱死者的電腦和手機恰梢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門佛南,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嵌言,你說我怎么就攤上這事嗅回。” “怎么了摧茴?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵绵载,是天一觀的道長。 經(jīng)常有香客問我,道長娃豹,這世上最難降的妖魔是什么焚虱? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮懂版,結(jié)果婚禮上鹃栽,老公的妹妹穿的比我還像新娘。我一直安慰自己定续,他們只是感情好谍咆,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布禾锤。 她就那樣靜靜地躺著私股,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恩掷。 梳的紋絲不亂的頭發(fā)上倡鲸,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音黄娘,去河邊找鬼峭状。 笑死,一個胖子當(dāng)著我的面吹牛逼争,可吹牛的內(nèi)容都是我干的优床。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼誓焦,長吁一口氣:“原來是場噩夢啊……” “哼胆敞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起杂伟,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤移层,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赫粥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體观话,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年越平,在試婚紗的時候發(fā)現(xiàn)自己被綠了频蛔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡秦叛,死狀恐怖晦溪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情书闸,我是刑警寧澤尼变,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響嫌术,放射性物質(zhì)發(fā)生泄漏哀澈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一度气、第九天 我趴在偏房一處隱蔽的房頂上張望割按。 院中可真熱鬧,春花似錦磷籍、人聲如沸适荣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弛矛。三九已至,卻和暖如春比然,著一層夾襖步出監(jiān)牢的瞬間丈氓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工强法, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留万俗,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓饮怯,卻偏偏與公主長得像闰歪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蓖墅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容