本周是第九周胶果,主要學(xué)習(xí)web服務(wù)器開發(fā)暂刘,django項(xiàng)目的創(chuàng)建锨侯,在老師的領(lǐng)導(dǎo)下開發(fā)了一個(gè)簡(jiǎn)易的投票django項(xiàng)目嫩海,了解了部分web應(yīng)用機(jī)制與術(shù)語,以及一些擴(kuò)展知識(shí)囚痴。在周末對(duì)本周知識(shí)點(diǎn)進(jìn)行了回顧與梳理叁怪。
第9周知識(shí)點(diǎn)整理
web應(yīng)用機(jī)制和術(shù)語
-URL/URI
-DNS
-IP地址
-http/https協(xié)議
-反向代理 : 保護(hù)服務(wù)器免于被直接攻擊與配置負(fù)載均衡
-web服務(wù)器 - Nginx/Apache
-應(yīng)用服務(wù)器 - uwsgi/gunicorn
-其他服務(wù)器 - redis,mysql深滚,sendmail奕谭,nfs,kafka等
web框架:django痴荐,flask血柳,tornado,sanic生兆,fastapi
HTTP協(xié)議是無連接無狀態(tài)協(xié)議 --> 兩次請(qǐng)求之間不會(huì)保存用戶任何數(shù)據(jù)
再次請(qǐng)求服務(wù)器時(shí)难捌,服務(wù)器無法得知請(qǐng)求來自誰的請(qǐng)求
對(duì)本地代碼實(shí)行版本控制并同步至版本控制服務(wù)器
git init
git add .
git commint -m 'version-name'
git status/ git log
git remote add origin url
git push -u(第一次) origin master
數(shù)據(jù)庫相關(guān)
以下使用MySQL數(shù)據(jù)庫
-DDL:create drop alter
-DML:insert delete update
-DQL:select
-DCL:grant revoke
項(xiàng)目架構(gòu)模式:MVC
數(shù)據(jù)和顯示分離
同一個(gè)模型可以渲染成不同視圖,同一個(gè)視圖可以加載不同的模型
django ORM框架
對(duì)象關(guān)系映射框架 - 解決對(duì)象模型的關(guān)系模型雙向轉(zhuǎn)換問題
django項(xiàng)目創(chuàng)建:
首先安裝框架 - pip install django==version
-
創(chuàng)建并運(yùn)行django項(xiàng)目
- pycharm方法- 用PyCharm創(chuàng)建一個(gè)普通的Python項(xiàng)目
- 安裝Django所需的依賴項(xiàng)
-pip install django==2.1.14 - 把Python項(xiàng)目變成Django項(xiàng)目
-django-admin startproject django1906 . - 運(yùn)行項(xiàng)目
- python manage.py runserver
- Add Configuration - Python - Script Path (manage.py) - Parameters (runserver)
- 克隆方式:
- 克隆項(xiàng)目到本地
-使用PyCharm的"get from version control"
-git clone git-url - 創(chuàng)建虛擬環(huán)境
-Linux/macOS: source venv/bin/activate
-Windows: "venv/Scripts/activate" - 重建依賴項(xiàng) - pip install -r requirements.txt
settings.py 部分修改:
# 加載web應(yīng)用
INSTALLED_APPS = [
.....
'app_name',
]
# 模板路徑
TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'templates'), ],
...
]
# 數(shù)據(jù)庫
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '項(xiàng)目名',
'HOST': '',
'PORT': 3306,
'USER': '',
'PASSWORD': '',
'CHARSET': 'utf8',
'TIME_ZONE': 'Asia/Chongqing',
}
}
# 語言時(shí)間
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Chongqing'
# 靜態(tài)資源路徑
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]
STATIC_URL = '/static/' - 靜態(tài)資源
# 服務(wù)器存儲(chǔ)圖片
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
urls.py template模板路徑:
# -服務(wù)器圖片儲(chǔ)存設(shè)置
urlpatterns = [
path('admin/', admin.site.urls),
path('', index),
path('teachers/', show_teachers),
path('praise/', praise_or_criticize),
path('criticize/', praise_or_criticize),
path('login/', login),
path('logout/', logout),
path('captcha/', get_captcha),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
views.py 數(shù)據(jù)的渲染皂贩,http請(qǐng)求與響應(yīng):
# 返回request對(duì)象栖榨,響應(yīng)頁面昆汹,數(shù)據(jù)
def index(request):
"""首頁明刷,所有學(xué)科"""
queryset = Subject.objects.all()
context = {
'subjects': queryset
}
return render(request, 'subjects.html', context)
創(chuàng)建Django后臺(tái)超級(jí)管理員賬號(hào)
命令終端 - python manage.py createsuperuser
后臺(tái)網(wǎng)址 - http://127.0.0.1:8000/admin
admin.py django自帶后臺(tái)管理設(shè)置:
class UserAdmin(admin.ModelAdmin):
list_display = ('no', 'username', 'password', 'reg_date', 'email', 'tel', 'last_visit')
list_display_links = ('no', 'username') # 管理鏈接
search_fields = ('username',) # 根據(jù)username字段搜索
ordering = ('no',) # 根據(jù)no字段排序
admin.site.register(User, UserAdmin)
models.py 使用django數(shù)據(jù)庫語句對(duì)數(shù)據(jù)庫進(jìn)行操作:
class User(models.Model):
"""用戶模型類"""
no = models.AutoField(primary_key=True, verbose_name='編號(hào)')
username = models.CharField(max_length=20, unique=True, verbose_name='用戶號(hào)')
password = models.CharField(max_length=32, verbose_name='口令')
email = models.CharField(default='', max_length=256, verbose_name='郵箱')
tel = models.CharField(max_length=11, verbose_name='手機(jī)號(hào)')
reg_date = models.DateTimeField(auto_now_add=True, verbose_name='注冊(cè)日期')
last_visit = models.DateTimeField(verbose_name='最后訪問時(shí)間')
def save(self): # 保存方法重寫
self.password = to_md5_hex(self.password) # 產(chǎn)生摘要
super().save()
class Meta: # 元數(shù)據(jù)
db_table = 'tb_user'
verbose_name = '用戶'
verbose_name_plural = '用戶'
數(shù)據(jù)遷移:
python manage.py makemigrations app_name
python manage.py migrate
其他知識(shí)點(diǎn)補(bǔ)充:
CSRF ---> 跨站請(qǐng)求偽造 ---> {% csrf_token %}
Cross Site Request Forge
CSRF令牌兩個(gè)作用:防范重放攻擊和跨站偽造請(qǐng)求
用于跟蹤 --> 服務(wù)器需要記住用戶為用戶提供更好的服務(wù)
服務(wù)器記住用戶有三種方式:
1.URL重寫
2.隱藏域(隱世表單域) --> 埋點(diǎn)
3.瀏覽器本地存儲(chǔ) - 最常見
- cookie:瀏覽器臨時(shí)文件,保存鍵值對(duì)满粗,cookie中的數(shù)據(jù)在發(fā)起HTTP請(qǐng)求時(shí)會(huì)自動(dòng)加載請(qǐng)求頭中辈末,如果瀏覽器禁用了cookie,基本上目標(biāo)網(wǎng)站的功能不能使用
- window.localStorage / window.sessionStorage
cookie和session的關(guān)系
request.session --> 服務(wù)器的一個(gè)對(duì)象
cookie --> 用戶瀏覽器臨時(shí)文件 --> cookie保存了session的id
BASE64編碼 - 用64個(gè)文字符號(hào)表示任意二進(jìn)制數(shù)據(jù)
原理:將原來的三字節(jié)每6個(gè)比特一組變成四個(gè)字節(jié)
用A-Z映皆、a-z挤聘、0-9、+和/一共64個(gè)字符來代表一個(gè)字節(jié)
Python ---> base64模塊 ---> b64encode() / b64decode()
JavaScript ---> window ---> btoa() / atob()
加密解密 RSA / AES ---> pycrypto
編碼解碼 base64 / 百分號(hào)編碼 ---> base64 / urllib.parse
摘要簽名 md5 sha1 sha256 sha512 ---> hashlib