[flask/python/web]學習flask web開發(Miguel著)遇到的一些問題及其解決方案

来源:http://www.cnblogs.com/xiaozhaoqi/archive/2017/07/12/7158088.html
-Advertisement-
Play Games

今天解決了第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框架的集成開發環境的介紹,如果此前一直使用文本和終端命令進行開發,那就太辛苦了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在某博客上看到的一個C++書籍閱讀清單,可以參考下: 階段 1《Essential C++》這是一本內容不多但很實用的C++入門書籍,強調快速上手與理解C++編程。本書主要圍繞一系列逐漸複雜的程式問題,以及用以解決這些問題的語言特性展開講解。你不只學到C++的函數和結構,也會學習到它們的設計目的和基 ...
  • 題目背景 mxj的啟發。 題目描述 禽獸患傳染病了。一個禽獸會傳染x個禽獸。試問n輪傳染後有多少禽獸被傳染? 輸入輸出格式 輸入格式: 兩個數x和n。 輸出格式: 一個數:被傳染的禽獸數。 輸入輸出樣例 輸入樣例#1: 10 2 輸出樣例#1: 121 輸入樣例#1: 10 2 輸出樣例#1: 12 ...
  • 題目描述 班主任給小玉一個任務,到文具店裡買儘量多的簽字筆。已知一隻簽字筆的價格是1元9角,而班主任給小玉的錢是a元b角,小玉想知道,她最多能買多少只簽字筆呢。 輸入輸出格式 輸入格式: 輸入的數據,在一行內,包括兩個整數,依次表示a和b,a<=10000,b<=9。 輸出格式: 輸出一個整數,表示 ...
  • 通過輸出$GLOBALS可以看到'/'後的參數都存在於$_SERVER['PATH_INFO']里; 聲明一個數組來獲取我們在'/'後傳遞的參數 $arr = explode('/', $_SERVER['PATH_INFO']); //print_r($arr)查看詳細信息 ...
  • 今天開始學習python,首先環境安裝 1.在https://www.python.org/downloads/下載python2.X或者3.X(ps:這裡建議下載32位的python ,因為64位python開發出來的程式,打包成 EXE程式後會不相容32位系統) 2.下載之後安裝,打開安裝包 2 ...
  • 一、連接資料庫 1. 步驟 2. 獲取Driver的方式 通過new新建 :Driver driver = new com.mysql.jdbc.Driver(); 通過反射創建類的實例 :Driver driver = (Driver)Class.forName(driverClass).newI ...
  • Python 之 filecmp 2017年7月12日 參考書籍:《Python自動化運維 ——技術與最佳實踐》 作者:李天斯 1.什麼是filecmp filecmp作為python的標準庫,無需安裝,作用是對文件,目錄,遍歷子目錄的差異對比功能,它是一個輕量級的工具,在對linux伺服器備份文件 ...
  • 項目做了動靜分離,即靜態文件全部放在nginx中,動態文件在tomcat中,如何引用靜態文件,我是這麼做的,見下: 運行結果: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...