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