能成大事的人總會做出很暖心的舉動,比如給我點個贊
技術棧
python
mysql
flask.pocoo.org
中文文檔:https://dormousehole.readthedocs.io/en/latest/quickstart.html
教程:
https://flask.net.cn/tutorial/index.html
輕量級框架
Flask通常被稱為微框架,因為核心功能包括基於Werkzeug的WSGI和路由以及基於Jinja2的模板引擎。 此外,Flask框架還支持cookie和會話以及Web助手,如JSON,靜態文件等。顯然,這對於開發完整的Web應用程序來說還不夠。 這是為什麼還要Flask擴展插件。 Flask擴展為Flask框架提供了可擴展性
//更多請閱讀:https://www.yiibai.com/flask/flask_extensions.html#article-start
https://zhuanlan.zhihu.com/p/27400862
OMR對象關系映射https://www.cnblogs.com/huanhang/p/6054908.html
SQLAlchemy 是一個功能強大的Python ORM 工具包,口碑不錯
數據庫的連接
數據庫操作邏輯
編輯用戶
根據id找到對應的用戶,對用戶的數據進行更新
user = User.query.get_404(id) # 如果id為none,返回404,否則返回調用
刪除用戶
添加角色:
db.session.add(role)
db.session.commit()
提交到數據庫
添加用戶:
在調用添加用戶函數的時候,生成一個默認的管理員賬戶,
engine = create_engine('dialect+driver://username:[email protected]:port/database')
dialect:數據庫類型
driver:數據庫驅動選擇
username:數據庫用戶名
password: 用戶密碼
host:服務器地址
port:端口
database:數據庫
操作
session(會話)的概念,可以看成一個管理數據庫持久連接的對象,在此下面是完全透明得連接池和事務等東西
get_session底下configure可以控制auto_commit參數,= False時寫操作默認都不放在事務裡,SQLAlchemy默認為True
session.add函數將會把Model加入當前的持久空間(可以從session.dirty看到),直到commit時更新
wtf form 保護表單免受跨站腳本攻擊
繼承Form 類或者子類
驗證器validator 都有message參數;
Required代表是必填
表單驗證
Required()
,validators
判讀用戶是否存在
User.query.filter_by(number=field.data).first()
繼承父類
super(EditForm, self).__init__(*args, **kargs)
單個參數和多參數
使用bootstrap 預先定義好的表單樣式渲染整個Flask-WTF表單,
wtf.quick_form() 函數的參數為 Flask-WTF 表單對象
Bootstrap
Bootstrap 是一個用於快速開發 Web 應用程序和網站的前端框架。Bootstrap 是基於 HTML、CSS、JAVASCRIPT 的
列的定義
https://blog.csdn.net/liyang_nash/article/details/81163782
{% import "bootstrap/wtf.html" as wtf %}
<form class="form" method="POST">
{
{ form.hidden_tag() }}
{
{ wtf.form_field(form.title) }} % 使用bootstrap 使用form.title form.body form.submit 使用默認進行渲染
{
{ wtf.form_field(form.body) }}
{
{ wtf.form_field(form.submit) }}
</form>
使用表單地默認樣式進行渲染
{% import "bootstrap/wtf.html" as wtf %}
{
{ wtf.quick_form(form) }}
Base.html
基類
{% extends "bootstrap/base.html" %}
繼承boostrap中的基類
form.hidden_tag()
模板參數將被替換為一個隱藏字段,用來是實現在配置中激活的 CSRF 保護。如果你已經激活了 CSRF,這個字段需要出現在你所有的表單中。
表單登錄
StringField
,PasswordField
,BooleanField
,SubmitField
,IntegerField
,FileField
,
https://www.yiibai.com/flask/flask_wtf.html
Django
@app.route('/',methods=['Get','POST'])
@login_required
裝飾器,判讀用戶是否登錄,只有登錄的用戶才能訪問請求
和django 是一樣的屬性
捕捉函數拋出異常,同Vue語法類似
@app.errorhandler(404) #
在終端可以使用指令來操作程序
command裝飾器後的作用,自定義命令
使用場景:創建一些敏感數據(後台管理員),批量添加測試數據
機器學習開源庫,,包含很多算法C++技術編寫的跨平台通用庫
dlib.get_frontal_face_detector函數實現人臉檢測可視化
1.1. 基於 HOG 特征和線性分類器的人臉檢測 下面是采用經典的 HOG(Histogram of Oriented Gradients) 特征 結合線性分類器、圖像金字塔(image pyramid) 及滑窗檢測機制(sliding window detection scheme)實現的人臉檢測器.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import dlib
detector = dlib.get_frontal_face_detector()
def face_detect(imgfile):
win = dlib.image_window()
print("Processing file: {}".format(imgfile))
img = dlib.load_rgb_image(imgfile)
# 人臉檢測
dets = detector(img, 1)
# len(dets) 即為檢測到的人臉個數
print("Number of faces detected: {}".format(len(dets)))
# 遍歷所有檢測到人臉的坐標
# left:人臉左邊距離圖片左邊界的距離
# right:人臉右邊距離圖片左邊界的距離
# top:人臉上邊距離圖片上邊界的距離
# bottom:人臉下邊距離圖片上邊界的距離
for i, d in enumerate(dets):
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
i, d.left(), d.top(), d.right(), d.bottom()))
win.clear_overlay()
win.set_image(img)
win.add_overlay(dets)
dlib.hit_enter_to_continue()
def face_detect_with_scores(imgfile):
win = dlib.image_window()
# 如果要進一步得到更全面的檢測信息,如每個檢測結果的分數(score).
# score 值越大,則檢測的可信度越高.
img = dlib.load_rgb_image(imgfile)
# 第三個參數 -1 用於設置調整檢測阈值;
# 如果該參數值為負數,則返回更多的結果;
# 如果該參數值為正數,則返回較少的結果.
dets, scores, idx = detector.run(img, 1, -1)
for i, d in enumerate(dets):
print("Detection {}, score: {}, face_type:{}".format(
d, scores[i], idx[i]))
win.clear_overlay()
win.set_image(img)
win.add_overlay(dets)
dlib.hit_enter_to_continue()
if __name__ == '__main__':
imgfile = "test.jpg"
face_detect(imgfile)
face_detect_with_scores(imgfile)
采用預訓練的 CNN 模型進行圖片中的人臉檢測.
基於 CNN 模型比基於 HOG 特征模型的人臉檢測准確度更高. 但是需要更多的計算資源,即在 GPU 上運行才可有較好的運行速率.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import dlib
# 加載預訓練人臉檢測CNN模型
cnn_face_model = "mmod_human_face_detector.dat"
cnn_face_detector = dlib.cnn_face_detection_model_v1(cnn_face_model)
def cnn_face_detect(imgfile):
win = dlib.image_window()
print("Processing file: {}".format(imgfile))
img = dlib.load_rgb_image(imgfile)
# CNN 人臉檢測器
# 檢測器返回 mmod_rectangles object,其包含 mmod_rectangle objects 列表.
# mmod_rectangle object 包含兩個變量:
# [1]. dlib.rectangle object
# [2]. confidence score
dets = cnn_face_detector(img, 1)
# 批量檢測圖片
# dets = cnn_face_detector([image list], upsample_num, batch_size = 128)
# len(dets) 即為檢測到的人臉個數
print("Number of faces detected: {}".format(len(dets)))
for i, d in enumerate(dets):
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {} Confidence: {}".format(
i, d.rect.left(), d.rect.top(), d.rect.right(), d.rect.bottom(), d.confidence))
rects = dlib.rectangles()
rects.extend([d.rect for d in dets])
win.clear_overlay()
win.set_image(img)
win.add_overlay(rects)
dlib.hit_enter_to_continue()
if __name__ == '__main__':
imgfile = "test.jpg"
cnn_face_detect(imgfile)
https://cloud.tencent.com/developer/article/1401153
視頻:馬士兵
python 基礎
內置類型,getitems 只需要指定方法名,很多對象可以寫入很多魔法函數,可迭代的特性
itenext 可迭代類型
call 可調用類型
動態語言,本身就是支持多態語言,無需指明類型,運行時候才能知道錯誤
無需繼承指定的類,鴨子類型是動態語言設計的一種理念;
hasattr(com,"_len__") # 判斷是否含有該屬性(方法)
某些情況需要判定某個對象類型,需要抽象基類
強制某個子類必須實現某些方法
定義一個抽象基類,用戶後期使用根據自己的需求,實現自己的方法,
子類自己實現基類的方法
abs
collections.abc
兩個不同的基類
使用裝飾器 @abc.abstractmethod
初始化的時候如果沒有子類沒有實現,這個時候會拋出異常,需要子類實現抽象基類;
模板函數 __class__
isinstance() 實例判斷 內部函數,接口的強制規定
isinstance and type
isinstance 檢查類型是否一致,返回True或者False,會根據繼承關系找到
is 和 == 符號區別
type(b) is B # 比較的是id 是否相同,
== 符號是判讀值是否相同
類變量和對象變量(實例變量)
類裡面的變量稱為類變量
初始化參數,self.變量是對象變量:先查找實例變量,找不到將向上查找類變量
對於類變量不會去找實例變量;
class A:
aa = 0
def __init__(self,x,y):
self.x = x
self.y = y
a = A()
A.aa = 11
a.aa = 100 # 這裡使用實例修改類變量會不會覆蓋類變量
print(a.aa) # 100 首先會在實例中查找aa的值
print(A.aa) # 11
__repr__()
內置函數通過重寫,來打印需要顯示的字符
使用conda 虛擬環境運行該項目
pip install -r requirements.txt
更新數據庫:python app.py db upgrade
生成管理員用戶:python app.py init
運行:python app.py runserver