今天解決了第11章_不顯示博文表單的問題,時間太晚了,先留個坑,明天寫出詳細的解決方案。 同時也將前11章(當我結束本書學習時會將所有的問題一一列出並給出中文的解決方案)的常見問題給予解答。 ...
今天解決了第11章_不顯示博文表單的問題
---------------------------------------------以下內容2017.7.14更新-----------------------------------------------------
flask web(封面上是一條狗)這本書前7章講了flask的基本概念,在第8章開始逐漸實現一個博客網站,建議讀者從這一章開始創建自己的工程,跟著書中的進度迭代自己的博客網站,而不是直接使用git clone命令從作者的示常式序中checkout當前版本,這樣做會遇到一些莫名其妙的問題,比如資料庫的一些錯誤。
切入正題,第11章直接checkout 11a,配置好環境變數,在Terminal中upgrade資料庫,用runserver參數執行manage.py,打開網站,然後註冊帳號,驗證,登錄,最後你會發現主頁上並沒有文章表單,也沒有作者的那句“What's on your mind?”。
原因在於:即使upgrade了資料庫,但當前的資料庫中沒有角色實例,也就是說你註冊的賬戶(即使是用程式中指定的郵箱註冊的管理員賬戶)沒有對應的角色的許可權,因此就無法看到提示/輸入框/提交按鈕。下麵是關於該文章表單的HTML代碼,位於app/templates/index.html:
1 <div> 2 {% if current_user.can(Permission.WRITE_ARTICLES) %} 3 {{ wtf.quick_form(form) }} 4 {% endif %} 5 </div>
可以看到,只有當前登錄的賬戶擁有“寫文章”的許可權,才向你展示寫文章的表單。
解決辦法:需要向資料庫中添加角色,再進行註冊/驗證/登錄,這樣就擁有了寫文章的許可權。在書中第99頁中間部分寫的很清楚,insert_roles函數並不直接創建新角色對象,而是查找現有角色,再進行更新。這是作者為了將來拓展角色類別(比如對普通用戶再進行細分)而進行的處理。下麵緊接著寫著:如果想把角色(指的是之前提到的用戶/協管員/管理員這三個角色)寫入資料庫,需要使用shell會話
1 >>>Role.insert_roles()
2 >>>Role.query.all()
來對資料庫中的角色進行更新,這樣資料庫中就有了上述三個角色。這時註冊的賬戶就都有了對應的角色,比如你使用程式中的Flask Admin靜態變數指定的郵箱註冊,那麼該賬戶自動成為管理員賬戶,擁有修改其他賬戶資料的許可權。
下麵是資料庫模型中User類的構造函數,可以看出當賬戶的角色為空的時候,分支語句選擇給賬戶綁定管理員角色或者預設角色,這裡的前提是資料庫中有角色,如果資料庫中沒有角色,就無法賦予賬戶對應的角色,也就沒法讓賬戶得到該有的許可權,結果就是沒有許可權的賬戶看不到寫文章的表單,實際上這時看到的內容只包括那些不需要任何許可權的內容,比如最初創建的菜單欄/登錄/註冊這些內容。
1 def __init__(self, **kwargs): 2 super(User, self).__init__(**kwargs) 3 if self.role is None: 4 if self.email == current_app.config['FLASKY_ADMIN']: 5 self.role = Role.query.filter_by(permissions=0xff).first() 6 if self.role is None: 7 self.role = Role.query.filter_by(default=True).first() 8 if self.email is not None and self.avatar_hash is None: 9 self.avatar_hash = hashlib.md5( 10 self.email.encode('utf-8')).hexdigest()
我的環境是ubuntu16.04,使用集成開發環境pycharm,flask框架常常需要導入大量的依賴包,只需在pycharm內置的terminal中執行sudo apt-get install -r requirements/xxx.txt(xxx是包名=版本號的序列文本)即可安裝所有依賴包,如果讀者不查資料的話,可能讀到本書203頁第18章才能找到關於適合flask框架的集成開發環境的介紹,如果此前一直使用文本和終端命令進行開發,那就太辛苦了。