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

    本周的學(xué)習(xí)內(nèi)容以Django為核心進(jìn)行展開,包括項(xiàng)目創(chuàng)建、模塊創(chuàng)建、變量配置、模型構(gòu)造、數(shù)據(jù)庫(kù)連接、頁(yè)面呈現(xiàn)等方面,具體內(nèi)容如下所示:

1、Django簡(jiǎn)介
Django是一個(gè)開放源代碼的Web應(yīng)用框架,由Python寫成。采用了MTV的框架模式,即模型M,模板T和視圖V。它最初是被開發(fā)來(lái)用于管理勞倫斯出版集團(tuán)旗下的一些以新聞內(nèi)容為主的網(wǎng)站的,即是CMS(內(nèi)容管理系統(tǒng))軟件。并于2005年7月在BSD許可證下發(fā)布。這套框架是以比利時(shí)的吉普賽爵士吉他手Django Reinhardt來(lái)命名的。

2、兩種框架模式:
1)MVC(核心-->解耦,強(qiáng)制性的使應(yīng)用程序的輸入,處理和輸出分開,減少各個(gè)模塊之間的耦合性,方便變更,更容易重構(gòu)代碼,最大程度地實(shí)現(xiàn)了代碼的復(fù)用):

M:Model --> 進(jìn)行業(yè)務(wù)邏輯判斷,數(shù)據(jù)庫(kù)存?。〝?shù)據(jù)存取層,主要負(fù)責(zé)數(shù)據(jù)庫(kù)的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ù)庫(kù)的CRUD
T:Template --> 負(fù)責(zé)把渲染的頁(yè)面展示給用戶
V:View --> 負(fù)責(zé)業(yè)務(wù)邏輯并適當(dāng)調(diào)用Model和Template(主要負(fù)責(zé)業(yè)務(wù)邏輯的處理)

注意:Django中還有一個(gè)url分發(fā)器,也叫作路由。主要用于將url請(qǐng)求發(fā)送給不同的View 處理,View再進(jìn)行相關(guān)的業(yè)務(wù)邏輯處理

3、Django的常規(guī)操作
1)pip install virtualenv: 安裝virtualenv(虛擬環(huán)境)(注:創(chuàng)建pycharm項(xiàng)目時(shí)需要指定虛擬環(huán)境,可以將不同版本的項(xiàng)目隔離開來(lái),項(xiàng)目上線時(shí)要將環(huán)境和項(xiàng)目分離開)
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 項(xiàng)目名: 創(chuàng)建django項(xiàng)目
6)python manage.py startapp hello_app: 創(chuàng)建app(模塊)。該命令是在工程下創(chuàng)建一個(gè)名為hello_app的app
app(模塊內(nèi)部文件簡(jiǎn)介):
init.py: 初始化,配置pymysql連接的地方
setting.py: 配置信息位置,databases等
urls.py: url路由,給每個(gè)請(qǐng)求尋找對(duì)應(yīng)的方法
wsgi.py: 網(wǎng)關(guān)
admin.py: 管理后臺(tái)注冊(cè)模型
apps.py: settings.py里面注冊(cè)app的時(shí)候需要使用到,一般不推薦直接使用
models.py:寫模型的地方,定義數(shù)據(jù)庫(kù)中的表結(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è)置語(yǔ)言 -- LANGUAGE_CODE = 'zh-hans'
7.5)修改時(shí)區(qū) -- TIME_ZONE = 'Asia/Shanghai'
7.6)注釋MIDDLEWARE中的'django.middleware.csrf.CsrfViewMiddleware'在
8)建立模型(位置:app.models.py)
定義的模型繼承于models.Model
db_tables: 定義數(shù)據(jù)庫(kù)中的表名稱
模型字段:
CharField: 字符串
max_length: 最大長(zhǎng)度
IntegerField: 整數(shù)
FloatField: 浮點(diǎn)數(shù)
BooleanField: 布爾類型(1,0)
DateField(auto_now_add=True/auto_now=True): 存放日期(年月日)
auto_now_add=True:第一次創(chuàng)建數(shù)據(jù)時(shí)設(shè)置時(shí)間(1次)
auto_now=True:每次登錄、修改操作都會(huì)更新到最新時(shí)間(多次)
DateTimeField:年月日 時(shí)分秒
auto_now_add:同上
auto_now:同上
AutoField: 自動(dòng)增長(zhǎng)
DecimalField:
models.DecimalField(max_digits=3,decimal_places=1) 最大值99.9
max_digits: 總位數(shù)
decimal_places: 小數(shù)點(diǎn)后的位數(shù)
TextField: 存長(zhǎng)文本信息,頁(yè)面等
FileField: 文件上傳字段
ImageField(upload_to=''): 上傳圖片
upload_to="":指定上傳圖片的路徑
模型參數(shù):
default='xxx':設(shè)置默認(rèn)值
null=True: 設(shè)置是否為空,針對(duì)數(shù)據(jù)庫(kù)中該字段是否可以為空
blank=True:設(shè)置是否為空,針對(duì)表單提交中該字段是否可以為空
primary_key=True:創(chuàng)建主鍵
unique:唯一

9)加載數(shù)據(jù)庫(kù)(位置:project.init.py)
import pymysql
pymysql.install_as_MySQLdb():當(dāng)成是mysqldb一樣使用,當(dāng)然也可以不寫這句,那就按照pymysql的方式
10)數(shù)據(jù)庫(kù)遷移
python manage.py makemigrations
python manage.py migrate
python manage.py makemigrations stu:強(qiáng)制找到stu模塊進(jìn)行遷移
Navicat中指定數(shù)據(jù)庫(kù)中的表django_migrations記錄了所有遷移記錄
11)啟動(dòng)項(xiàng)目
python manage.py runserver ip:端口號(hào)(默認(rèn)8000端口):啟動(dòng)django項(xiàng)目,端口號(hào)可以不用寫,啟動(dòng)的時(shí)候會(huì)默認(rèn)隨機(jī)創(chuàng)建一個(gè)可以使用的端口

12)(*暫時(shí)可有可無(wú))創(chuàng)建超級(jí)管理員的帳號(hào)和密碼
python manage.py createsuperuser

4、Django過濾:
1)修改字段名
alter table table_name change 原名稱 修改后名稱 類型

    2)objects對(duì)象
         通過模型.objects來(lái)實(shí)現(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: 主鍵和外鍵是一對(duì)一關(guān)系,在關(guān)聯(lián)表中,只能關(guān)聯(lián)一個(gè)主表的id (一般添加到擴(kuò)展表,關(guān)聯(lián)到主表)
拓展表找主表:拓展信息對(duì)象.關(guān)聯(lián)字段
主表找拓展表:主表對(duì)象.關(guān)聯(lián)表的model_name
1:N OneToManyField
N:N MangToManyField

on_delete=xxx:刪除主表的時(shí)候,從表的狀態(tài)
        models.CASCADE:級(jí)聯(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: 語(yǔ)文成績(jī):{{stu.stu_chinese | add:10}} -- add:加法,增加值

    時(shí)間
           date:(在數(shù)據(jù)庫(kù)中時(shí)間會(huì)比頁(yè)面顯示中少8個(gè)小時(shí),操作時(shí)需要注意)
                  Y-完整年份(四位年)    m:月
                  y-簡(jiǎn)寫年份(兩位年)   n:日
                  H-時(shí) 24小時(shí)制            m:分
                  h-時(shí) 12小時(shí)制              s:秒
                  example: 創(chuàng)建時(shí)間:{{ 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ù)乘法運(yùn)算
           widthratio 數(shù) 分母 分子
           example:語(yǔ)文成績(jī)乘以10:{% widthratio stu.stu_chinese 1 10 %} 
                          <!-- stu.stu_chinese * 10(分子) / 1(分母)-->

   整除運(yùn)算
          divisibleby:2  整除2,返回True,否則返回False
          example:數(shù)學(xué)成績(jī):{{ stu.stu_math | divisibleby:2}}  
                         <!-- 判斷數(shù)學(xué)成績(jī)是否能整除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)容為空時(shí)執(zhí)行的操作
         {% endfor %}
  
 if:
         {% if xxx %}
         {%  else  %}
         {%  endif %}

 ifequal:  # 如果相等時(shí)的操作
         {% ifequal xxx 1 %}
         {% else %}
         {% endifequal %}

 forloop
         計(jì)數(shù)從0開始: {{ forloop.counter0 }}
         計(jì)數(shù)從1開始: {{ forloop.counter }}
         計(jì)數(shù)從最后開始,到1停: {{ forloop.revcounter }}
         計(jì)數(shù)從最后開始,到0停: {{ forloop.revcounter0 }}

7、REQUEST處理
post -- 提交數(shù)據(jù)隱藏了
get -- 提交數(shù)據(jù)在url上, ?后跟參數(shù),&用來(lái)連接多個(gè)參數(shù),但是對(duì)參數(shù)的數(shù)量有限制,每個(gè)瀏覽器的限制不同
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移動(dòng),在瀏覽器
session: 在數(shù)據(jù)庫(kù)
set_cookie(key,value,seconds): 設(shè)置cookie,并為其綁定令牌,令牌有過期時(shí)間,可以設(shè)置并存放在mysql或mongodb
1)綁定令牌到cookie里面,并將cookie存在前端
ticket = 'lalala'
response = HttpResponse()
response.set_cookie('ticket',ticket)
return response
2)cookie存在數(shù)據(jù)庫(kù)中
user.u_ticket = ticket
user.save()
del_cookie(): 刪除cookie

  常見問題見解:
  1)同一個(gè)瀏覽器登錄兩個(gè)qq空間,內(nèi)容會(huì)互串 --> 原因:瀏覽器只能就一個(gè)應(yīng)用程序保存一個(gè)cookie,即后登陸的空間的cookie,再訪問的便是后登陸空間的內(nèi)容

  2)cookie中是否有權(quán)限:cookie只是用于保存專屬于一個(gè)特定用戶的令牌,將每個(gè)用戶分隔開來(lái),用于和數(shù)據(jù)庫(kù)端的令牌進(jìn)行比對(duì)成功后進(jìn)行后續(xù)操作而無(wú)需再輸入帳號(hào)密碼(一般cookie有生存時(shí)間,超時(shí)cookie將被刪除,則需要重新登錄,類似于淘寶、天貓長(zhǎng)時(shí)間不操作便會(huì)要求重新登錄),至于權(quán)限,數(shù)據(jù)庫(kù)中應(yīng)當(dāng)專門存儲(chǔ)權(quán)限表,并和指定用戶關(guān)聯(lián)

  3)cookie加密:不用,明碼傳輸即可,一個(gè)人創(chuàng)建的令牌叫ticket,則另一個(gè)人創(chuàng)建的令牌則可能叫session

9、科普知識(shí)
1) Jinja2 --> Python下一個(gè)被廣泛應(yīng)用的模版引擎,他的設(shè)計(jì)思想來(lái)源于Django的模板引擎,并擴(kuò)展了其語(yǔ)法和一系列強(qiáng)大的功能。其中最顯著的一個(gè)是增加了沙箱執(zhí)行功能和可選的自動(dòng)轉(zhuǎn)義功能,這對(duì)大多應(yīng)用的安全性來(lái)說是非常重要的。它基于unicode并能在python2.4之后的版本運(yùn)行,包括python3
2)QueryDict和dict的區(qū)別 --> QueryDict定義在django.http.QueryDict,request對(duì)象的屬性GET、POST都是QueryDict類型的對(duì)象,與python字典(dict)不同,QueryDict類型的對(duì)象用來(lái)處理同一個(gè)鍵帶有多個(gè)值的情況
3)ORM(objects relational mapping): 對(duì)象關(guān)系映射,翻譯機(jī)
4)alt + enter: 提示當(dāng)前應(yīng)用的函數(shù)所需要導(dǎo)入的包
5)path: 查看PATH路徑中的內(nèi)容

  通過本周的理論知識(shí)學(xué)習(xí)及實(shí)際應(yīng)用項(xiàng)目的操練,筆者在一定程度上理解了MTV框架模式的原理,Django項(xiàng)目的設(shè)計(jì)流程,網(wǎng)站前后端交互的過程等,為后續(xù)基于Django的整站開發(fā)打下了基礎(chǔ),后續(xù)階段需要進(jìn)一步將css,html等內(nèi)容融入到django項(xiàng)目中,使項(xiàng)目更加豐富、完整
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容