❶ 如何在flask 中使用 service worker
Service Worker 是用來控制同一個 origin 下的緩存啊網路請求啥的,它被用來代替 appcache 。 Push API 是 Service Worker 其中的一個功能。 依賴於 service worker ,這意味著他們都需要在 https origin 下才能使用。
❷ flask配置生產環境
書接上文 flask與sqlAlchemy ,我們了解到
這一步的的測試可以看 一個小型的資源管理站
這里與直接上結果。
原flask使用的WSGI是python,但是很明顯python作為HTTP解釋器是效率低下的。而且,直接運行flask也是非常糟心的。比如集中配置,比如多進程多線程,比如socket通信,比如log管理,比如進程管理
將此文件放置在項目的根目錄,並創建文件夾uwsgi
詳見 https://www.jianshu.com/p/4c0fb2ed6083
flask+uWSGI已經能實現webserver的功能了,但是更加優秀的weberver還需要nginx的輔助。
Nginx(發音同engine x)是非同步框架的網頁伺服器,也可以用作反向代理、負載平衡器和HTTP緩存。
還有寫拓展處理 主要看服務配置
這里 nginx -s reload 已經完成了服務配置。如果不想配置服務,直接到nginx根目錄運行 ./sbin/nginx
這里給大家推薦一個不錯的平台:Cloudflare
Cloudflare
在使用之前我們需要更換自己的頂級域名代理商,這一步此處以騰訊雲截圖:
跳過注冊等過程,我們直接進入域名管理界面,看到
然後創建密鑰
xxx.pem
xxx.key
再扔到伺服器上去。
最後再配置nginx
總結配置flask一般形態的生產環境nginx+uwsgi+flask
回到目錄
❸ flask web開發遇到sqlalchemy 查詢為None怎麼解決
講資料庫操作了
創建表
首先,我們要讓Flask-SQLAlchemy 根據模型類創建資料庫。方法是使用db.create_all()
函數:
(venv) $ python hello.py shell
>>> from hello import db
>>> db.create_all()
插入行
下面這段代碼創建了一些角色和用戶:
>>> from hello import Role, User
>>> admin_role = Role(name='Admin')
>>> mod_role = Role(name='Moderator')
>>> user_role = Role(name='User')
>>> user_john = User(username='john', role=admin_role) #User類雖然沒有role屬性,但是在上一章節裡面的Role裡面設置了一個backref屬性,就是用來反向作用的。
>>> user_susan = User(username='susan', role=user_role) #注意啊,這里的role=user_role針對的是上一章節裡面說的,對應的是模型對象!不是鍵的值!!!
>>> user_david = User(username='david', role=user_role)
模型的構造函數接受的參數是使用關鍵字參數指定的模型屬性初始值。注意,role 屬性也可使用,雖然它不是真正的資料庫列,但卻是一對多關系的高級表示。這些新建對象的id屬性並沒有明確設定,因為主鍵是由Flask-SQLAlchemy 管理的。現在這些對象只存在於Python 中,還未寫入資料庫。因此id 尚未賦值:
>>> print(admin_role.id)
None
>>> print(mod_role.id)
None
>>> print(user_role.id)
None
通過資料庫會話管理對資料庫所做的改動,在Flask-SQLAlchemy 中,會話由db.session表示。准備把對象寫入資料庫之前,先要將其添加到會話中:
>>> db.session.add(admin_role)
>>> db.session.add(mod_role)
>>> db.session.add(user_role)
>>> db.session.add(user_john)
>>> db.session.add(user_susan)
>>> db.session.add(user_david)
或者簡寫成
db.session.add_all([admin_role, mod_role, user_role,
... user_john, user_susan, user_david])
這里的session首先是和前面章節講的HTTP裡面的session不一樣的
不過我感覺作用是類似的,相當於一個緩存的作用,把實例化生成的對象存放在session裡面
最後通過commit命令執行保存在資料庫內。
db.session.commit()
接著,再去查看屬性,已經有了
>>> print(admin_role.id)
1
>>> print(mod_role.id)
2
>>> print(user_role.id)
3
修改行
在資料庫會話上調用add() 方法也能更新模型。我們繼續在之前的shell 會話中進行操作,下面這個例子把"Admin" 角色重命名為"Administrator":
>>> admin_role.name = 'Administrator'
>>> db.session.add(admin_role)
>>> db.session.commit()
刪除行
資料庫會話還有個delete() 方法。下面這個例子把"Moderator" 角色從資料庫中刪除:
>>> db.session.delete(mod_role)
>>> db.session.commit()
查詢行
Flask-SQLAlchemy 為每個模型類都提供了query 對象。最基本的模型查詢是取回對應表中
的所有記錄:
>>> Role.query.all()
[<Role u'Administrator'>, <Role u'User'>]
>>> User.query.all()
[<User u'john'>, <User u'susan'>, <User u'david'>]
使用過濾器可以配置query 對象進行更精確的資料庫查詢。下面這個例子查找角色為"User" 的所有用戶:
>>> User.query.filter_by(role=user_role).all()
[<User u'susan'>, <User u'david'>]
filter_by()等過濾器在query 對象上調用,返回一個更精確的query 對象。多個過濾器可以一起調用,直到獲得所需結果。
關系和查詢的處理方式類似。下面這個例子分別從關系的兩端查詢角色和用戶之間的一對多關系:
>>> users = user_role.users
>>> users
[<User u'susan'>, <User u'david'>]
>>> users[0].role
<Role u'User'>
這個例子中的user_role.users 查詢有個小問題。執行user_role.users 表達式時,隱含的查詢會調用all() 返回一個用戶列表。query 對象是隱藏的,因此無法指定更精確的查詢
過濾器。就這個特定示例而言,返回一個按照字母順序排序的用戶列表可能更好。在示例5-4 中,我們修改了關系的設置,加入了lazy = 'dynamic' 參數,從而禁止自動執行查詢。
示例5-4hello.py:動態關系
class Role(db.Model):
# ...
users = db.relationship('User', backref='role', lazy='dynamic')
# ...
這樣配置關系之後,user_role.users 會返回一個尚未執行的查詢,因此可以在其上添加過
濾器:
>>> user_role.users.order_by(User.username).all()
[<User u'david'>, <User u'susan'>]
>>> user_role.users.count()
2
我的理解是,通過添加lazy參數後,他生成的對象就是不直接顯示內容,而是要通過過濾器才能顯示的。
❹ python flask request怎麼接收數組值
函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。 函數能提高應用的模塊性,和代碼的重復利用率。你已經知道Python提供了許多內建函數,比如print()。但你也可以自己創見函數,這被叫做用戶自定義函數。 一、定義一個函數 ...
❺ flask web開發遇到sqlalchemy 查詢為None怎麼解決
一、fliter_by(port=data)這樣才對!!你定義model的時候明明是用的「port」來定義label,查詢的時候當然也要用「port」
二、講資料庫操作了
創建表
首先,我們要讓Flask-SQLAlchemy 根據模型類創建資料庫。方法是使用db.create_all()
函數:
(venv) $ python hello.py shell
>>> from hello import db
>>> db.create_all()
插入行
下面這段代碼創建了一些角色和用戶:
>>> from hello import Role, User
>>> admin_role = Role(name='Admin')
>>> mod_role = Role(name='Moderator')
>>> user_role = Role(name='User')
>>> user_john = User(username='john', role=admin_role)
#User類雖然沒有role屬性,但是在上一章節裡面的Role裡面設置了一個backref屬性,就是用來反向作用的。
>>> user_susan = User(username='susan', role=user_role)
#注意啊,這里的role=user_role針對的是上一章節裡面說的,對應的是模型對象!不是鍵的值!!!
>>> user_david = User(username='david', role=user_role)
模型的構造函數接受的參數是使用關鍵字參數指定的模型屬性初始值。注意,role
屬性也可使用,雖然它不是真正的資料庫列,但卻是一對多關系的高級表示。這些新建對象的id屬性並沒有明確設定,因為主鍵是由Flask-SQLAlchemy
管理的。現在這些對象只存在於Python 中,還未寫入資料庫。因此id 尚未賦值:
>>> print(admin_role.id)
None
>>> print(mod_role.id)
None
>>> print(user_role.id)
None
通過資料庫會話管理對資料庫所做的改動,在Flask-SQLAlchemy
中,會話由db.session表示。准備把對象寫入資料庫之前,先要將其添加到會話中:
>>> db.session.add(admin_role)
>>> db.session.add(mod_role)
>>> db.session.add(user_role)
>>> db.session.add(user_john)
>>> db.session.add(user_susan)
>>> db.session.add(user_david)
或者簡寫成
db.session.add_all([admin_role, mod_role, user_role,
... user_john, user_susan, user_david])
這里的session首先是和前面章節講的HTTP裡面的session不一樣的
不過我感覺作用是類似的,相當於一個緩存的作用,把實例化生成的對象存放在session裡面
最後通過commit命令執行保存在資料庫內。
db.session.commit()
接著,再去查看屬性,已經有了
>>> print(admin_role.id)
1
>>> print(mod_role.id)
2
>>> print(user_role.id)
3
修改行
在資料庫會話上調用add() 方法也能更新模型。我們繼續在之前的shell 會話中進行操作,下面這個例子把"Admin"
角色重命名為"Administrator":
>>> admin_role.name = 'Administrator'
>>> db.session.add(admin_role)
>>> db.session.commit()
刪除行
資料庫會話還有個delete() 方法。下面這個例子把"Moderator" 角色從資料庫中刪除:
>>> db.session.delete(mod_role)
>>> db.session.commit()
查詢行
Flask-SQLAlchemy 為每個模型類都提供了query 對象。最基本的模型查詢是取回對應表中
的所有記錄:
>>> Role.query.all()
[, ]
>>> User.query.all()
[, , ]
使用過濾器可以配置query 對象進行更精確的資料庫查詢。下面這個例子查找角色為"User" 的所有用戶:
>>> User.query.filter_by(role=user_role).all()
[, ]
filter_by()等過濾器在query 對象上調用,返回一個更精確的query 對象。多個過濾器可以一起調用,直到獲得所需結果。
關系和查詢的處理方式類似。下面這個例子分別從關系的兩端查詢角色和用戶之間的一對多關系:
>>> users = user_role.users
>>> users
[, ]
>>> users[0].role
這個例子中的user_role.users 查詢有個小問題。執行user_role.users 表達式時,隱含的查詢會調用all()
返回一個用戶列表。query 對象是隱藏的,因此無法指定更精確的查詢
過濾器。就這個特定示例而言,返回一個按照字母順序排序的用戶列表可能更好。在示例5-4 中,我們修改了關系的設置,加入了lazy = 'dynamic'
參數,從而禁止自動執行查詢。
示例5-4hello.py:動態關系
class Role(db.Model):
# ...
users = db.relationship('User', backref='role', lazy='dynamic')
# ...
這樣配置關系之後,user_role.users 會返回一個尚未執行的查詢,因此可以在其上添加過
濾器:
>>> user_role.users.order_by(User.username).all()
[, ]
>>> user_role.users.count()
2
我的理解是,通過添加lazy參數後,他生成的對象就是不直接顯示內容,而是要通過過濾器才能顯示的。
❻ flask 載入css不成功問題
是整個css文件不成功,還是單獨一個css不行,如果是整個文件不好使就是路徑問題,如果是單獨一個不好使就是引用問題。如果都沒錯就清理緩存重新打開網頁看看
❼ python flask rest怎麼傳參數
Client-Server:伺服器端與客戶端分離。
Stateless(無狀態):每次客戶端請求必需包含完整的信息,換句話說,每一次請求都是獨立的。
Cacheable(可緩存):伺服器端必需指定哪些請求是可以緩存的。
Layered System(分層結構):伺服器端與客戶端通訊必需標准化,伺服器的變更並不會影響客戶端。
Uniform Interface(統一介面):客戶端與伺服器端的通訊方法必需是統一的。
❽ Flask視圖:視圖函數,類視圖,藍圖使用方法整理
摘要: Flask , 視圖 , 視圖函數 , 類視圖 , 方法視圖 , 裝飾器 , 藍圖
在Flask中 路由 是指用戶請求的 URL 與 視圖函數 之間的 映射 ,處理URL和函數之間關系的程序稱為路由。Flask根據HTTP請求的URL在路由表中匹配預定義的URL找到對應的視圖函數。將視圖函數的執行結果返回給伺服器。
Flask中默認使用 @app.route 裝飾器將視圖函數和URL綁定,裝飾器是一種接受函數的函數,返回新的函數。
使用裝飾器將視圖函數page和url '/'關系綁定帶 app.url_map 屬性上,列印app.url_map的結果如下,有兩條url規則,分別是根目錄下的URL規則和static目錄下的URL規則
可以給裝飾器增加 endpoint 參數給 url命名 ,一旦使用了endpoint參數 url_for 反轉就不能使用視圖函數名了而要使用定義的url名。
url_for('index')的輸出是字元串格式url的內容"/"
也可以不使用裝飾器,使用 add_url_rule 將視圖函數和url綁定,裝飾器 @app.route 實際是調用的 add_url_rule 方法
視圖函數也可以結合類來實現,類視圖的好處是支持 繼承 ,可以將共性的東西放到父類中,類視圖需要使用 app.add_url_rule() 來進行注冊,類視圖分為 標准類視圖 和 基於調度方法的類視圖
標准類視圖有標準的寫法
使用類視圖,在父類中定義一個屬性,在子類中完成各自的業務邏輯,同時都繼承父類中的這一個屬性
分別定義三個子類的模板
查看結果,三個url的返回除了三個模板各自的內容外都需要輸出父類的ads屬性
如果同一個視圖函數需要根據 不同的請求方式 進行不一樣的邏輯處理,需要在視圖函數內部進行判斷,可以使用 方法類視圖 實現,使用類繼承 flask.views.MethodView ,定義和請求方式 同名的小寫方法 來完成了邏輯處理。
編輯一個頁面直接訪問是輸出用戶名密碼頁面,提交表單後是密碼正確與否的提示。
在html中定義 form 標簽action屬性關聯url名
如果不用方法視圖實現需要在普通視圖內部調用 request.method 判斷是否為 GET , POST 進行判斷
裝飾器的本質是一個Python函數, 接受一個函數 , 返回一個函數 ,目的是讓一個函數獲得 其他額外的功能 。
假設一個場景訪問新聞詳情頁又一個函數實現,但是之前必須先登錄,登錄由另一個函數實現,此時需要將訪問新聞函數傳遞給登錄函數返回一個新的函數作為整體的邏輯實現,這個給登錄函數增加新功能瀏覽網頁的過程就是裝飾器。
控制台輸出,new_func()執行了新函數,基礎函數user_login執行了新加入的功能,新函數真實的函數名還是inner
如果使用裝飾器魔法符號實現,此時直接調用被裝飾的函數即可實現帶有新功能的基礎函數,函數作為參數傳入的過程已經自動實現
在基礎函數和要包裝的函數上都支持傳遞參數
查看 app.route() 的源碼內部也是將視圖函數包裝,在原函數執行之前調用 add_url_rule 綁定url,endpoint和視圖函數的關系,再返回原函數實現業務邏輯
藍圖的目的是實現 各個模塊的視圖函數寫在不同的py文件中 ,在主視圖中導入分路由視圖的模塊,並注冊藍圖對象, 降低各個功能模塊的耦合度 ,使用 flask.Blueprint 定義藍圖, app.register_blueprint 注冊藍圖。
實現主頁,詳情頁,對比頁三個頁面,在主頁中導入兩個其他功能頁,先編寫兩個功能頁的藍圖detail.py和compare.py
使用 app = Blueprint('detail', __name__) 定義藍圖對象, detail 是藍圖名,藍圖名不能重復。再編寫主視圖main.py,在主視圖中注冊之前的藍圖,其他視圖函數的名字不能和藍圖名一致
查看效果
如果在藍圖的py腳本中調用了 url_for ,需要把藍圖的name(就是 name 之前的)也加入作為前綴,如下