前端、数据库、Django简单的练习
一、前端
1、前端頁(yè)面由哪幾層構(gòu)成,分別是什么,作用是什么?
分為:結(jié)構(gòu)層(html),表示層(css),行為層(js)。
結(jié)構(gòu)層
超文本標(biāo)記語(yǔ)言。由HTML或XHTML之類(lèi)的標(biāo)記語(yǔ)言負(fù)責(zé)創(chuàng)建。標(biāo)簽,也就是那些出現(xiàn)在括號(hào)里的單詞,對(duì)網(wǎng)頁(yè)內(nèi)容的語(yǔ)義做出了描述,但這些標(biāo)簽不包含任何關(guān)于如何顯示有關(guān)內(nèi)容的信息。例如:p標(biāo)簽表達(dá)了這樣一種語(yǔ)義:“這是一個(gè)文本段。”
表示層
層疊樣式表。由css負(fù)責(zé)創(chuàng)建。css對(duì)“如何顯示有關(guān)內(nèi)容”的問(wèn)題做出了回答。
行為層
客戶(hù)端腳本語(yǔ)言。負(fù)責(zé)回答“內(nèi)容應(yīng)該如何對(duì)事件做出反應(yīng)”這一問(wèn)題。這是JavaScript語(yǔ)言和DOM主宰的領(lǐng)域。
2、html中總共有幾類(lèi)標(biāo)簽的?分別描述一下它們的不同?
塊級(jí)標(biāo)簽、內(nèi)聯(lián)標(biāo)簽、內(nèi)聯(lián)塊狀標(biāo)簽(img、input)。
內(nèi)聯(lián)標(biāo)簽不能包含塊級(jí)標(biāo)簽,塊級(jí)標(biāo)簽?zāi)軌虬瑑?nèi)聯(lián)標(biāo)簽也能夠包含塊級(jí)標(biāo)簽(除了p元素,p元素不能相互包含,但是p元素能夠包含其他元素。)
3、display:none和visibility:hidden的區(qū)別?
a)display:none是徹底消失,不在文檔流中占位,瀏覽器不會(huì)解析該元素;visibility:hidden是視覺(jué)上消失了,在文檔流中會(huì)占位,瀏覽器會(huì)解析該元素。
b)使用visibility:hidden比display:none性能上要好,display切換顯示時(shí)頁(yè)面會(huì)產(chǎn)生回流(當(dāng)頁(yè)面中的一部分元素需要改變規(guī)模尺寸、布局、顯示隱藏等,頁(yè)面重新構(gòu)建,此時(shí)就是回流)而visibility切換顯示時(shí)則不會(huì)引起回流。
4、input標(biāo)簽都有哪些類(lèi)型,input標(biāo)簽都有哪些屬性?
類(lèi)型:button、checkbox、file、hidden、image、password、radio、reset、submit、text
屬性:type、required、pattern(輸入內(nèi)容必須完全匹配正則表達(dá)式)、placeholder(提示輸入)、disabled(禁用)、name、id、style。
5、闡述一下css定位有幾種?并分別描述它們的不同。
relative(相對(duì)定位):相對(duì)定位的偏移參考元素是元素本身,不會(huì)使元素脫離文檔流。元素的初始位置占據(jù)的空間會(huì)被保留。相對(duì)定位元素常常作為絕對(duì)定位元素的父元素。并且定位元素經(jīng)常與z-index屬性進(jìn)行層次分級(jí)
absolute(絕對(duì)定位):絕對(duì)定位元素以父輩元素中最近的定位元素為參考坐標(biāo),如果絕對(duì)定位元素的父輩元素中沒(méi)有采用定位的,那么此絕對(duì)定位元素的參考對(duì)象是html,元素會(huì)脫離文檔流。就好像文檔流中被刪除了一樣。并且定位元素經(jīng)常與z-index屬性進(jìn)行層次分級(jí)
position:fixed(固定):位移的參考坐標(biāo)是可視窗口,使用fixed的元素脫離文檔流。并且定位元素經(jīng)常與z-index屬性進(jìn)行層次分級(jí)
position:static(靜態(tài)定位):默認(rèn)值,元素框正常生成的,top left bottom right這幾個(gè)偏移屬性不會(huì)影響其靜態(tài)定位的正常顯示
6、js的基礎(chǔ)數(shù)據(jù)類(lèi)型有哪些?Null和Undefined的區(qū)別?
基礎(chǔ)數(shù)據(jù)類(lèi)型:Undefined、Null、String、Number、Boolean。引用類(lèi)型有這幾種:object、Array、RegExp、Date、Function、特殊的基本包裝類(lèi)型(String、Number、Boolean)以及單體內(nèi)置對(duì)象(Global、Math)。
Null和Undefined的區(qū)別:
null表示“沒(méi)有對(duì)象”,即該處不該有值。典型用法:
(1) 作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對(duì)象。
(2) 作為對(duì)象原型鏈的終點(diǎn)。
undefined表示“缺少值”,就是此處應(yīng)該有一個(gè)值,但是還沒(méi)有定義。典型用法是:
(1)變量被聲明了,但沒(méi)有賦值時(shí),就等于undefined。
(2) 調(diào)用函數(shù)時(shí),應(yīng)該提供的參數(shù)沒(méi)有提供,該參數(shù)等于undefined。
(3)對(duì)象沒(méi)有賦值的屬性,該屬性的值為undefined。
(4)函數(shù)沒(méi)有返回值時(shí),默認(rèn)返回undefined。
7、列出jQuery常用的選擇器
基本css選擇器:元素選擇器、類(lèi)選擇器、ID選擇器。
上下文選擇器:后代選擇器、兒子選擇器、兄弟選擇器、毗鄰選擇器
8、事件委托是什么?
事件委托是利用事件的冒泡原理來(lái)實(shí)現(xiàn)的,何為事件冒泡呢?就是事件從最深的節(jié)點(diǎn)開(kāi)始,然后逐步向上傳播事件,舉個(gè)例子:頁(yè)面上有這么一個(gè)節(jié)點(diǎn)樹(shù),div>ul>li>a;比如給最里面的a加一個(gè)click點(diǎn)擊事件,那么這個(gè)事件就會(huì)一層一層的往外執(zhí)行,執(zhí)行順序a>li>ul>div,有這樣一個(gè)機(jī)制,那么我們給最外面的div加點(diǎn)擊事件,那么里面的ul,li,a做點(diǎn)擊事件的時(shí)候,都會(huì)冒泡到最外層的div上,所以都會(huì)觸發(fā),這就是事件委托,委托它們父級(jí)代為執(zhí)行事件。
二、數(shù)據(jù)庫(kù)
1、數(shù)據(jù)庫(kù)的字段類(lèi)型有哪些?
二進(jìn)制數(shù)據(jù)類(lèi)型:Binary、Varbinary、Image
字符數(shù)據(jù)類(lèi)型:Char,Varchar、text
Unicode數(shù)據(jù)類(lèi)型:Nchar、Nvarchar、Ntext
日期和時(shí)間數(shù)據(jù)類(lèi)型:數(shù)字?jǐn)?shù)據(jù)類(lèi)型包括正數(shù)和負(fù)數(shù)、小數(shù)和整數(shù)
smallint、int、bigint
2、說(shuō)說(shuō)你所知道的MySQL數(shù)據(jù)存儲(chǔ)引擎,InnoDB存儲(chǔ)引擎和MyISM存儲(chǔ)引擎的區(qū)別?
MySQL中常用的幾種存儲(chǔ)引擎:MyISAM、InnoDB、bdb、MEMORY,
MyISAM存儲(chǔ)引擎:
MyISAM 這種存儲(chǔ)引擎不支持事務(wù),不支持行級(jí)鎖,只支持并發(fā)插入的表鎖,主要用于高負(fù)載的select。所以其寫(xiě)入的并發(fā)處理能力相對(duì)較弱。
MyISAM類(lèi)型的數(shù)據(jù)表(.MYD文件)支持三種不同的存儲(chǔ)結(jié)構(gòu):靜態(tài)型、動(dòng)態(tài)型、壓縮型。
靜態(tài)型:就是定義的表列的大小是固定(即不含有:xblob、xtext、varchar等長(zhǎng)度可變的數(shù)據(jù)類(lèi)型),這樣mysql就會(huì)自動(dòng)使用靜態(tài)myisam格式。
使用靜態(tài)格式的表的性能比較高,因?yàn)樵诰S護(hù)和訪(fǎng)問(wèn)的時(shí)候以預(yù)定格式存儲(chǔ)數(shù)據(jù)時(shí)需要的開(kāi)銷(xiāo)很低。但是這高性能是有空間換來(lái)的,因?yàn)樵诙x的時(shí)候是固定的,所以不管列中的值有多大,都會(huì)以最大值為準(zhǔn),占據(jù)了整個(gè)空間。
innoDB存儲(chǔ)引擎:
同MyISAM一樣的是,InnoDB存儲(chǔ)引擎也有.frm文件存儲(chǔ)表結(jié)構(gòu)定義
innodb存儲(chǔ)引擎該mysql表提供了事務(wù),回滾以及系統(tǒng)崩潰修復(fù)能力和多版本并發(fā)控制的事務(wù)的安全。
InnoDB有支持事務(wù)及安全的日志文件,這個(gè)文件非常重要,InnoDB可以通過(guò)日志文件將數(shù)據(jù)庫(kù)崩潰時(shí)已經(jīng)完成但還沒(méi)來(lái)得及將內(nèi)存中已經(jīng)修改但未完全寫(xiě)入磁盤(pán)的數(shù)據(jù)寫(xiě)入磁盤(pán),也可以把已部分完成并寫(xiě)入磁盤(pán)的未完成事務(wù)回滾,保證數(shù)據(jù)一致性。如果錯(cuò)誤刪除日志文件會(huì)導(dǎo)致數(shù)據(jù)庫(kù)崩潰且無(wú)法啟動(dòng)。
innodb支持自增長(zhǎng)列(auto_increment),自增長(zhǎng)列的值不能為空,如果在使用的時(shí)候?yàn)榭盏脑?huà)就會(huì)進(jìn)行自動(dòng)存現(xiàn)有的值開(kāi)始增值,如果有但是比現(xiàn)在的還大,則就保存這個(gè)值。
innodb存儲(chǔ)引擎支持外鍵(foreign key) ,外鍵所在的表稱(chēng)為子表而所依賴(lài)的表稱(chēng)為父表。
3、索引的本質(zhì)是什么?索引有什么優(yōu)點(diǎn)?缺點(diǎn)是什么?
索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。
優(yōu)點(diǎn):
第一,通過(guò)創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性。
第二,可以大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因。
第三,可以加速表和表之間的連接,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。
第四,在使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí),同樣可以顯著減少查詢(xún)中分組和排序的時(shí)間。
第五,通過(guò)使用索引,可以在查詢(xún)的過(guò)程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。
?? 缺點(diǎn):
第一,創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,這種時(shí)間隨著數(shù)據(jù)量的增加而增加。
第二,索引需要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個(gè)索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會(huì)更大。
第三,當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。
4、char和varchar的區(qū)別,varchar(50)和char(50)分別代表什么意思?
char的長(zhǎng)度是不可變的,而varchar的長(zhǎng)度是可變的。
char的存取數(shù)度還是要比varchar要快得多,因?yàn)槠溟L(zhǎng)度固定,方便程序的存儲(chǔ)與查找;但是char也為此付出的是空間的代價(jià),因?yàn)槠溟L(zhǎng)度固定,所以難免會(huì)有多余的空格占位符占據(jù)空間,可謂是以空間換取時(shí)間效率,而varchar是以空間效率為首位的。
5、簡(jiǎn)述你對(duì)inner join、left join、right join的理解。
inner join(內(nèi)連接),在兩張表進(jìn)行連接查詢(xún)時(shí),只保留兩張表中完全匹配的結(jié)果集。
left join(左連接),在兩張表進(jìn)行連接查詢(xún)時(shí),會(huì)返回左表所有的行,即使在右表中沒(méi)有匹配的記錄。
right join(右連接),在兩張表進(jìn)行連接查詢(xún)時(shí),會(huì)返回右表所有的行,即使在左表中沒(méi)有匹配的記錄。
full join(全連接),在兩張表進(jìn)行連接查詢(xún)時(shí),返回左表和右表中所有沒(méi)有匹配的行。
三、數(shù)據(jù)庫(kù)
1、寫(xiě)出你所知道的Django有關(guān)的所有命令(下載、安裝等)。
1. Django的安裝
pip install django ==1.11.11
pip install -i yuan django==1.11.11
2. 創(chuàng)建項(xiàng)目
django-admin startproject? 項(xiàng)目名
通過(guò)manage.py執(zhí)行
CD項(xiàng)目目錄下
3.創(chuàng)建APP
python manage.py startapp app01
4. 啟動(dòng)項(xiàng)目
python manage.py runserver # 127.0.0.1:8000
python manage.py runserver 80 # 127.0.0.1:80
python manage.py runserver 0.0.0.0: 80 # 0.0.0.0:80
5. 數(shù)據(jù)庫(kù)相關(guān)
python manage.py makemigrations # 記錄modeles 的變化,將變更記錄到 對(duì)應(yīng)APP 下的 migrations
python manage.py migrate? # 翻譯成SQL語(yǔ)句,去數(shù)據(jù)庫(kù)執(zhí)行
?
-------------------------------------------------------------我是下劃線(xiàn)-----------------------------------------------------
?
配置settings.py
1. 數(shù)據(jù)庫(kù)相關(guān)
EGNIGE: 引擎 mysql sqllite3
NAME: 數(shù)據(jù)庫(kù)名字
HOST: IP
POST:? 端口號(hào) 3306
USER: 用戶(hù)名
PASSWORD: 密碼? ? ? ‘ ’
2. 靜態(tài)文件相關(guān)
STATIC_URL= ‘static’? # 別名
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'STATIC'),
]
3. APP
INSTALLED_APPS = [
'app01.apps.App01Config',? ? #告訴 Django我自己新建了一個(gè)名叫app01的應(yīng)用
# ‘a(chǎn)pp01’
]
4. CSRF
注釋掉CSRF中間件? form表單可以提交POST請(qǐng)求
5. TEMPLATES
'DIRS':[os.path.join(BASE_DIR,'TEMPLATES')]
?
----------------------------------------------------------我是下劃線(xiàn)--------------------------------------------------------
?
ORM的對(duì)應(yīng)關(guān)系
類(lèi)? -------- 數(shù)據(jù)表
對(duì)象 ? -------- 數(shù)據(jù)行
屬性 ? -------- 字段
?
-----------------------------------------------------我是下劃線(xiàn)------------------------------------------------------
?
Django使用mysql數(shù)據(jù)庫(kù)的步驟:
1.手動(dòng)創(chuàng)建mysql數(shù)據(jù)庫(kù)
2. 在settings.py中配置:
DATABASES = {
'default':{
'ENGINE': 'django.db.background.mysql', # 連接數(shù)據(jù)庫(kù)的類(lèi)型
'NAME': 'mysite' # 數(shù)據(jù)庫(kù)名
'HOST': '127.0.0.1', # 數(shù)據(jù)庫(kù)主機(jī)地址
'POST':? 3306? # 數(shù)據(jù)庫(kù)的端口
'USER': 'root',
'PASSWORD': ' ',
}
}
3. 告訴Django使用pymysql連接數(shù)據(jù)庫(kù)
在于settings.py 文件同級(jí)的目錄下的__init__.py寫(xiě)代碼:
import pymysql
pymysql.install_as_MySQLdb()
4. 在models.py中寫(xiě)類(lèi)(繼承models.Model)
class Press(models.Model):
id = models.AutoField(primary_key=True) # id主鍵
name = models.CharField(max_length=32) # 出版社名稱(chēng)
def __str__(self):
return '<這是一個(gè)出版社對(duì)象,它的名字是:{}>'.format(self.name)
#? 書(shū)
class Book(models.Model):
id = models.AutoField(primary_key=True) #自增ID主鍵
title= models.CharField(max_length=30) # 書(shū)名
price = models.IntegerField() # 價(jià)格
# Django 1.11 默認(rèn)就是級(jí)聯(lián)刪除 , Django2.0 之后必須指定on_delete
# to=關(guān)聯(lián)的表名
press =? models.ForeignKey('Press_on_delete=models.CASCADE')
# 作者
class? Author(models.Model):
id = models.AutoField(primary_key=True) # 自增ID主鍵
name = models.CharField(max_length=32) # 作者名字
books = models.ManyToManyField(to='book') # 只是ORM層面建立的一個(gè)多對(duì)多關(guān)系,不是作者表的一個(gè)字段
def __str__(self):
return self.name
5. 執(zhí)行命名
python manage.py makemigrations # 記錄models的變化,將變更記錄到 對(duì)應(yīng)APP下的migrations
python manage.py migrate #? 翻譯成SQL語(yǔ)句,去數(shù)據(jù)庫(kù)執(zhí)行
?
-----------------------------------------------------我是下劃線(xiàn)--------------------------------------------------------
?
ORM操作
1. 查:
from app01.models import User,Press,Book,Author
Press.objects.all() # 查詢(xún)所有出版社對(duì)象 ------? 對(duì)象列表 queryset
Press.objects.filter(條件) # 查詢(xún)所有滿(mǎn)足條件的出版社對(duì)象? ------ 對(duì)象列表 queryset
Press.objects.get(條件) ? # 查詢(xún)有且只能有一個(gè)對(duì)象 沒(méi)有或者多個(gè)都報(bào)錯(cuò) ---- 對(duì)象
屬性:
press_obj.id
press_obj.name
外鍵:
book_obj.id
book_obj.title
book_obj.press -------關(guān)聯(lián)的對(duì)象
book_obj.press_id ? -------數(shù)據(jù)庫(kù)中的關(guān)聯(lián)對(duì)象的ID
book_obj.press.id
多對(duì)多:
author——obj.books ? ------管理對(duì)象
author_obj.books.all() ------作者關(guān)聯(lián)的所有書(shū)籍對(duì)象
2. 增加:
new_obj = Press.objects.create(name='新的出版社')
Book.objects.create(title='書(shū)名',price = 15,press=press_obj)
Book.objects.create(title='書(shū)名',price=15,press_id=press_obj.id)
new_obj = Author.objects.create(name='作者名')
new_obj.books.set([1,2,3])
new_obj.books.set([book1,book2])
?
new_obj.books.add(1,2,3)
3. 刪除
book_obj.delete()? ------刪除單個(gè)對(duì)象
Press.objects,filter(條件).delete()? ?-------刪多個(gè)對(duì)象
?
4. 編輯
press_obj.name = '新的出版社名字'
press_obj.save()
book_obj.press = press_obj
# book_obj.press_id = press_obj.id
book_obj.save()
?
author_obj.name = '作者名'
author_obj.save()
author_obj.books.set([1,2,3])
2、Django的settings中,你用到的配置項(xiàng)有哪些?它們的作用是什么?
TEMPLATE_DIRS
模板文件存放的目錄.該值是一個(gè)元組.
STATIC_URL
映射到靜態(tài)文件的url,一般為/static/.
在模板中使用{{STATIC_URL}},得到的就是這個(gè)值.
或者在模板中先{% load staticfiles %},然后使用{% static “my_app/abc.jpg” %},該模板標(biāo)簽的值為/static/my_app/abc.jpg
最好使用nginx代理該url,訪(fǎng)問(wèn)靜態(tài)文件時(shí)不通過(guò)django,而是直接由nginx訪(fǎng)問(wèn).
注意:如果用ngxin代理的話(huà),那么每次修改static文件,都需要執(zhí)行一遍collectstatic命令
STATICFILES_FINDERS
默認(rèn)該值如下:
‘django.contrib.staticfiles.finders.FileSystemFinder’,
‘django.contrib.staticfiles.finders.AppDirectoriesFinder’
FileSystemFinder告訴django從STATICFILES_DIRS設(shè)置的所有目錄下尋找靜態(tài)文件
AppDirectoriesFinder告訴Django從INSTALLED_APPS中每一個(gè)app下的static/ 子目錄下去尋找靜態(tài)文件
STATIC_ROOT
是總的static目錄,可以使用命令自動(dòng)收集static文件
使用命令python manage.py collectstatic收集靜態(tài)文件,將所有靜態(tài)文件復(fù)制到STATIC_ROOT設(shè)置的目錄下.
STATICFILES_DIRS
是個(gè)元組,每一項(xiàng)都是靜態(tài)文件存放的目錄.
當(dāng)執(zhí)行collectstatic命令時(shí),會(huì)將STATICFILES_DIRS下的所有靜態(tài)文件收集到STATIC_ROOT目錄下.
3、Django使用MySQL數(shù)據(jù)庫(kù)的流程是什么?
4、分別定義一個(gè)FBV和CBV,以及它們的路由?
FBV
from django.shortcuts import render def index(req): ????if req.method == ‘POST‘: ????????print(‘method is :‘ + req.method) ????elif req.method == ‘GET‘: ????????print(‘method is :‘ + req.method) ????return render(req, ‘index.html‘) url(r‘^index/‘, views.index),CBV
from django.views import View class Index(View): ????def get(self, req): ????????print(‘method is :‘ + req.method) ????????return render(req, ‘index.html‘) ????def post(self, req): ????????print(‘method is :‘ + req.method) ????????return render(req, ‘index.html‘)url(r‘^index/‘, views.Index.as_view()),
5、寫(xiě)出你知道的request對(duì)象的方法和屬性。
request對(duì)象的方法:
1.HttpRequest.get_host()——(根據(jù)從HTTP_X_FORWARDED_HOST(如果打開(kāi) USE_X_FORWARDED_HOST,默認(rèn)為False)和 HTTP_HOST ??????????????????????????????????????????????????????????????????????????????????????????????????????????????? 頭部信息返回請(qǐng)求的原始主機(jī)。)2.HttpRequest.get_full_path()——(返回 path,如果可以將加上查詢(xún)字符串。) 3.HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)——(返回簽名過(guò)的Cookie 對(duì)應(yīng)的值,如果簽名 ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 不再合法則返回django.core.signing.BadSignature。) 4.HttpRequest.is_secure() ——(如果請(qǐng)求時(shí)是安全的,則返回True;即請(qǐng)求通是過(guò) HTTPS 發(fā)起的。) 5.HttpRequest.is_ajax()——(如果請(qǐng)求是通過(guò)XMLHttpRequest 發(fā)起的,則返回True,方法是檢查 HTTP_X_REQUESTED_WITH ?????????????????????????????????????????????? 相應(yīng)的首部是否是字符串'XMLHttpRequest'。)
request對(duì)象的屬性:
0.HttpRequest.scheme(表示請(qǐng)求方案的字符串)
1.HttpRequest.body(一個(gè)字符串,代表請(qǐng)求報(bào)文的主體)
2.HttpRequest.path(一個(gè)字符串,表示請(qǐng)求的路徑組件(不含域名))
3.HttpRequest.method(一個(gè)字符串,表示請(qǐng)求使用的HTTP 方法。必須使用大寫(xiě)。)
4.HttpRequest.encoding(一個(gè)字符串,表示提交的數(shù)據(jù)的編碼方式)
5.HttpRequest.GET(一個(gè)類(lèi)似于字典的對(duì)象,包含 HTTP GET 的所有參數(shù))
6.HttpRequest.POST(一個(gè)類(lèi)似于字典的對(duì)象,如果請(qǐng)求中包含表單數(shù)據(jù),則將這些數(shù)據(jù)封裝成 QueryDict 對(duì)象。)
7.HttpRequest.COOKIES(一個(gè)標(biāo)準(zhǔn)的Python 字典,包含所有的cookie。鍵和值都為字符串。)
8.HttpRequest.FILES(一個(gè)類(lèi)似于字典的對(duì)象,包含所有的上傳文件信息。)
9.HttpRequest.META(一個(gè)標(biāo)準(zhǔn)的Python 字典,包含所有的HTTP 首部)
10.HttpRequest.user(一個(gè) AUTH_USER_MODEL 類(lèi)型的對(duì)象,表示當(dāng)前登錄的用戶(hù)。)
11.HttpRequest.session(一個(gè)既可讀又可寫(xiě)的類(lèi)似于字典的對(duì)象,表示當(dāng)前的會(huì)話(huà))
?
?
?
?
?
?
?
?
?
?
?
6、如何在URLconf中給url命名?在視圖和模板中如何使用url反向解析?
? urlpatterns = patterns('', (r'^mydata/(?P<id>\d+)/$', views.my_view, {'id':3}), )
在模板(可以理解為HTML文件)里面可以這樣引用:
{% url "home" %}在views函數(shù)中可以這樣引用:
from django.urls import reverseredirect(reverse("index",args=("2018", )))7、請(qǐng)寫(xiě)出你所知道的模板語(yǔ)法。
一、模板語(yǔ)法之變量:語(yǔ)法為 {{ }}:
{{ d.name }}
{{ person_list.1.name }}
二、模板語(yǔ)法之標(biāo)簽:語(yǔ)法為 {% tag ?%}:
1、for標(biāo)簽(注:循環(huán)序號(hào)可以通過(guò){{forloop}}顯示)
2、for....empty :for?標(biāo)簽帶有一個(gè)可選的{%?empty?%}?從句,以便在給出的組是空的或者沒(méi)有被找到時(shí),可以有所操作。
?
{% for person in person_list %}<p>{{ person.name }}</p> {% empty %} <p>sorry,no person here</p> {% endfor %}?
3、if標(biāo)簽 :{%?if?%}會(huì)對(duì)一個(gè)變量求值,如果它的值是“True”(存在、不為空、且不是boolean類(lèi)型的false值),對(duì)應(yīng)的內(nèi)容塊會(huì)輸出。
?
{% if i > 300 %}<p>大于{{ i }}</p> {% elif i == 200 %} <p>等于{{ i }}</p> {% else %} <p>小于{{ i }}</p> {% endif %}?
4、with:使用一個(gè)簡(jiǎn)單地名字緩存一個(gè)復(fù)雜的變量,當(dāng)你需要使用一個(gè)“昂貴的”方法(比如訪(fǎng)問(wèn)數(shù)據(jù)庫(kù))很多次的時(shí)候是非常有用的
?
{% with total=business.employees.count %}{{ total }} employee{{ total|pluralize }} {% endwith %}?
<p>{{ person_list.2.name }}</p> {% with name=person_list.2.name %} <p>{{ name }}</p> {% endwith %}?
5、csrf_token:這個(gè)標(biāo)簽用于跨站請(qǐng)求偽造保護(hù)
?
<h3>scrf_token</h3><form action="/tag/" method="post"> {% csrf_token %} <p><input type="text" name="haiyan"></p> <input type="submit"> </form>?
8、請(qǐng)寫(xiě)出模板和繼承的使用方法。
1)繼承使用
步驟1:母板里寫(xiě)入block,就可以被繼承,content是名稱(chēng)
?
{% block title %}{% endblock%}{% block “content“ %}{% endblock%}?
步驟2:子頁(yè)面通過(guò)extends指定繼承那個(gè)模板
?
{% extends 'master.html'%} #繼承那個(gè)模板{% block “content“ %} 這個(gè)地方就是替換模板block “content“<ul>{% for i in u%}<li>{{i}}</li> {%endfor%}{% endblock%}?
2)一個(gè)頁(yè)面只能繼承一個(gè)模板,如何解決了?如何使用多個(gè)模板,或者引入其他頁(yè)面
<% include "a.html" %> 可以引用多次
9、請(qǐng)寫(xiě)出自定義filter的步驟。
10、cookie和session是什么?為什么要使用它們?
一、為什么要用Cookie和Session?
?????? 很多時(shí)候客戶(hù)端和服務(wù)器進(jìn)行交互使用了HTTP協(xié)議,但是HTTP協(xié)議是無(wú)狀態(tài)的;HTTP協(xié)議的請(qǐng)求過(guò)程,是基于 TCP/IP 的,當(dāng)客戶(hù)端請(qǐng)求服務(wù)器,服務(wù)器處理后,進(jìn)行響應(yīng),該過(guò)程是無(wú)狀態(tài)的。
?????? 但是在有些時(shí)候是需要保存一些客戶(hù)端的請(qǐng)求信息,識(shí)別客戶(hù)端的某些狀態(tài),智能的、有針對(duì)性的去分析某些客戶(hù)端的習(xí)慣。這些時(shí)候,就需要去記錄客戶(hù)端的連接狀態(tài),識(shí)別請(qǐng)求的狀態(tài)等。所以為了解決類(lèi)似的事情,就需要使用到了 Cookie 和?Session。
?????? 比如,使用Cookie的場(chǎng)景:有些網(wǎng)站有記住用戶(hù)名的功能,當(dāng)你勾這個(gè)的時(shí)候,下次進(jìn)入該網(wǎng)站時(shí),就會(huì)保存上一次登錄的用戶(hù)名;使用Seesion的場(chǎng)景:利用Seesion來(lái)驗(yàn)證用戶(hù)是否已登錄,利用Session來(lái)保存驗(yàn)證碼。
二、Cookie和Session是什么?
??? (1)Cookie:在客戶(hù)端訪(fǎng)問(wèn)某個(gè)地址時(shí),會(huì)將請(qǐng)求交到服務(wù)器進(jìn)行處理,在發(fā)送請(qǐng)求的時(shí)候,瀏覽器會(huì)將頁(yè)面的頭部信息一并的交到服務(wù)器端進(jìn)行處理。在處理的過(guò)程中,Cookie 在服務(wù)器端生成 ,在此同時(shí),可以將一些需要保存的信息,存放到此 Cookie 中。生成 Cookie 對(duì)象時(shí),需要確定具體的名稱(chēng)及具體的值,可以設(shè)置當(dāng)前?Cookie?的過(guò)期時(shí)間,設(shè)置過(guò)期時(shí)間后,就相當(dāng)于持久化了 Cookie 中的數(shù)據(jù),此時(shí)的 Cookie 會(huì)以之前的 Cookie 名稱(chēng),保存在客戶(hù)端。
如果不設(shè)置過(guò)期時(shí)間,則當(dāng)前 Cookie 的生命期是瀏覽器會(huì)話(huà)期間,一旦關(guān)閉了該瀏覽器,當(dāng)前的Cookie 就會(huì)不存在了,此時(shí)的 Cookie 信息是保存在內(nèi)存中。在服務(wù)器端,處理完后,會(huì)將生成的 Cookie ,隨著 Http 響應(yīng),會(huì)在 Http 響應(yīng)頭中,加上Cookie 信息,瀏覽器接受到響應(yīng)后,會(huì)按照 Http 響應(yīng)頭里的 Cookie ,在客戶(hù)端建立 Cookie 。在下次客戶(hù)進(jìn)行請(qǐng)求的時(shí)候,Http 會(huì)附帶著已經(jīng)存儲(chǔ)過(guò)的 Cookie,一并發(fā)送到服務(wù)器。一個(gè)域,在客戶(hù)端建立的所以 Cookie 都是可以共享的,只要 Cookie 沒(méi)有過(guò)期。
??? (2)Session:Session 是在服務(wù)器端生成的,存儲(chǔ)在服務(wù)器端,即存在內(nèi)存中。可以對(duì)生成的 Session 設(shè)置過(guò)期時(shí)間,如果不設(shè)置過(guò)期時(shí)間,默認(rèn)的 Session 過(guò)期時(shí)間是30 分鐘(在不同的服務(wù)器中,它的過(guò)期時(shí)間略有不同,本文是以 Tomcat 來(lái)說(shuō)的)? 但是,Sesssion 的生成的同時(shí),會(huì)生成一個(gè)與之相關(guān)聯(lián)的的?SessionID ,此 SessionID的存儲(chǔ)是需要 Cookie 來(lái)完成的。 SessionID 是以名稱(chēng)為 JSESSIONID,其值應(yīng)該是一個(gè)既不會(huì)重復(fù),又不容易被找到規(guī)律以仿造的字符串。SessionID會(huì)隨著此次 Http 響應(yīng),一并返回到客戶(hù)端,并保存在客戶(hù)端中。到當(dāng)前請(qǐng)求再次發(fā)出后,該 SessionID會(huì)隨著 Http 頭部,傳到服務(wù)器中,服務(wù)器依據(jù)當(dāng)前 SessionID 得到與之對(duì)應(yīng)的 Session.
其中:通過(guò) Cookie 的方式存儲(chǔ) Session 狀態(tài),只是其中一種方式。如果客戶(hù)端禁用了 Cookie 的話(huà),很多網(wǎng)站任然可以存儲(chǔ)用戶(hù)的信息。一種處理的方式是URL 重寫(xiě),將 SesseionID 直接附加在請(qǐng)求地址的后面。另一種處理的方式是,使用隱藏自動(dòng)的方式。就是服務(wù)器自動(dòng)的在表單中,添加一個(gè)隱藏字段,以便在表單提交時(shí),將 SesseionID 一起傳到服務(wù)器,進(jìn)行識(shí)別。
?
轉(zhuǎn)載于:https://www.cnblogs.com/wjs521/p/9823593.html
總結(jié)
以上是生活随笔為你收集整理的前端、数据库、Django简单的练习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 学习——JavaWeb05:JSP入门
- 下一篇: 响应式css