前言
Flask是一个轻量级的Web框架,用于快速开发Web应用程序。它的设计理念是简洁、灵活和易于扩展,非常适合于从简单的单页应用到复杂的大型项目。通过Flask,可以创建各种Web应用程序,比如博客、电子商务网站、RESTful API等。
保姆级别 项目体验 Demo 地址:
https://github.com/couragesteak/flask_frame_demo
1 安裝
1.1 Flask
Flask==3.0.2
Flask-Cors==4.0.1
测试环境 Python3.10.9
1.2 MySQL 数据库
ubuntu
sudo apt-get install libmysqlclient-dev
centos
yum install -y mysql-devel gcc gcc-devel python-devel
pip install flask-mysqldb -i https://pypi.douban.com/simple
否则报错 没有包 MySqldb
2 基础案例 与 蓝图
原创:有勇气的牛排
https://www.couragesteak.com/article/457
2.1 蓝图
蓝图(Blueprint)是一个用于组织和管理应用程序的强大工具。它可以使程序拆分的更小、更模块化,从而提高代码的可扩展性。
- 模块化开发
- 提高代码复用
- 简化路由管理,不至于过于庞大
- 团队协作,不同人维护不同块
2.2 案例
main.py
from flask import Flask
from flask import render_template
from flask import request
from flask_cors import CORS
import os
app = Flask(
__name__,
template_folder='template',
static_url_path='/',
static_folder='resource'
)
app.secret_key = os.urandom(24)
CORS(app, supports_credentials=True)
from src.main.controller.index import index
app.register_blueprint(index)
@app.before_request
def before():
url = request.path
print(url)
pass_list = [
'/', '/login', '/logout',
'/vcode', '/ecode', '/register'
]
if url in pass_list or url.endswith('.js')
pass
else:
print('路由不在白名单 需要登录')
username = request.cookies.get('username')
password = request.cookies.get('password')
print(username, password)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8081, debug=True)
蓝图 index.py
from flask import Blueprint, render_template
index = Blueprint('index', __name__)
@index.route('/')
def home():
res = dict(
name="有勇氣的牛排"
)
return render_template('index.html', result=res)
3 获取参数 GET、POST
@m_test.route('/param_test', methods=['GET', 'POST'])
def param_test():
method = request.method
data = dict(
nickname="有勇氣的牛排",
url="https://www.couragesteak.com/",
)
if method == 'GET':
id = request.args.get('id', None)
data['id'] = id
return render_template('test_param.html', data=data)
elif method == 'POST':
id = request.form.get('id', None)
data['id'] = id
else:
param = 'No valid method'
return jsonify(data)
4 重定向
@m_test.route('/redirect_with_param')
def redirect_with_param():
result = dict(
name="有勇氣的牛排"
)
return redirect('/')
5 模板
这里使用render_template,也可以使用其他模板,比如 Jinja2
py
@index.route('/')
def home():
res = dict(
name="有勇氣的牛排"
)
return render_template('index.html', result=res)
html模板
<div>
<div>
<a href="/">首頁</a>
<a href="/login">登錄</a>
<a href="/param_test">參數測試</a>
<a href="/logout">退出登錄</a>
<a href="/js/jquery-3.4.1.min.js">打開靜態文件</a>
<a href="/redirect_with_param">重定向測試</a>
</div>
首頁: {{ result.name }}
</div>

6 报错路由 404/500
@app.errorhandler(404)
def not_found(e):
return render_template('error_404.html')
@app.errorhandler(500)
def internal_error():
return render_template('error_500.html')
详细文档:
https://dormousehole.readthedocs.io/en/latest/quickstart.html
<h2><a id="_0"></a>前言</h2>
<p>Flask是一个轻量级的Web框架,用于快速开发Web应用程序。它的设计理念是简洁、灵活和易于扩展,非常适合于从简单的单页应用到复杂的大型项目。通过Flask,可以创建各种Web应用程序,比如博客、电子商务网站、RESTful API等。</p>
<p>保姆级别 项目体验 Demo 地址:<br />
<a href="https://github.com/couragesteak/flask_frame_demo" target="_blank">https://github.com/couragesteak/flask_frame_demo</a></p>
<h2><a id="1__7"></a>1 安裝</h2>
<h3><a id="11_Flask_9"></a>1.1 Flask</h3>
<pre><div class="hljs"><code class="lang-python">Flask==<span class="hljs-number">3.0</span><span class="hljs-number">.2</span>
Flask-Cors==<span class="hljs-number">4.0</span><span class="hljs-number">.1</span>
</code></div></pre>
<p>测试环境 Python3.10.9</p>
<h3><a id="12_MySQL__20"></a>1.2 MySQL 数据库</h3>
<p>ubuntu</p>
<pre><code class="lang-powershell">sudo apt-get install libmysqlclient-dev
</code></pre>
<p>centos</p>
<pre><code class="lang-powershell">yum install -y mysql-devel gcc gcc-devel python-devel
</code></pre>
<pre><code class="lang-powershell">pip install flask-mysqldb -i https://pypi.douban.com/simple
</code></pre>
<p>否则报错 没有包 MySqldb</p>
<h2><a id="2____42"></a>2 基础案例 与 蓝图</h2>
<p>原创:有勇气的牛排</p>
<p><a href="https://www.couragesteak.com/article/457" target="_blank">https://www.couragesteak.com/article/457</a></p>
<h3><a id="21__48"></a>2.1 蓝图</h3>
<p>蓝图(Blueprint)是一个用于组织和管理应用程序的强大工具。它可以使程序拆分的更小、更模块化,从而提高代码的可扩展性。</p>
<ul>
<li>模块化开发</li>
<li>提高代码复用</li>
<li>简化路由管理,不至于过于庞大</li>
<li>团队协作,不同人维护不同块</li>
</ul>
<h3><a id="22__59"></a>2.2 案例</h3>
<p>main.py</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> Flask
<span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> render_template
<span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> request
<span class="hljs-keyword">from</span> flask_cors <span class="hljs-keyword">import</span> CORS
<span class="hljs-keyword">import</span> os
app = Flask(
__name__,
template_folder=<span class="hljs-string">'template'</span>, <span class="hljs-comment"># 定义html文件位置</span>
static_url_path=<span class="hljs-string">'/'</span>, <span class="hljs-comment"># 定义静态资源路由路径</span>
static_folder=<span class="hljs-string">'resource'</span> <span class="hljs-comment"># 定义静态资源文件夹</span>
)
<span class="hljs-comment"># app.config['SECRET_KEY'] = os.urandom(24) # 生成随机数种子,用于产生SessionID</span>
app.secret_key = os.urandom(<span class="hljs-number">24</span>) <span class="hljs-comment"># 用于加密会话数据</span>
<span class="hljs-comment"># 允许跨域请求</span>
CORS(app, supports_credentials=<span class="hljs-literal">True</span>)
<span class="hljs-comment"># 导入蓝图</span>
<span class="hljs-keyword">from</span> src.main.controller.index <span class="hljs-keyword">import</span> index
app.register_blueprint(index)
<span class="hljs-comment"># 定义全局拦截器,实现自动登录</span>
<span class="hljs-meta">@app.before_request</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">before</span>():
url = request.path
<span class="hljs-built_in">print</span>(url)
<span class="hljs-comment"># 路由 白名单</span>
pass_list = [
<span class="hljs-string">'/'</span>, <span class="hljs-string">'/login'</span>, <span class="hljs-string">'/logout'</span>,
<span class="hljs-string">'/vcode'</span>, <span class="hljs-string">'/ecode'</span>, <span class="hljs-string">'/register'</span>
]
<span class="hljs-keyword">if</span> url <span class="hljs-keyword">in</span> pass_list <span class="hljs-keyword">or</span> url.endswith(<span class="hljs-string">'.js'</span>)
<span class="hljs-keyword">pass</span>
<span class="hljs-keyword">else</span>:
<span class="hljs-built_in">print</span>(<span class="hljs-string">'路由不在白名单 需要登录'</span>)
username = request.cookies.get(<span class="hljs-string">'username'</span>)
password = request.cookies.get(<span class="hljs-string">'password'</span>)
<span class="hljs-built_in">print</span>(username, password)
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">'__main__'</span>:
app.run(host=<span class="hljs-string">'0.0.0.0'</span>, port=<span class="hljs-number">8081</span>, debug=<span class="hljs-literal">True</span>)
</code></div></pre>
<p>蓝图 index.py</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> Blueprint, render_template
index = Blueprint(<span class="hljs-string">'index'</span>, __name__)
<span class="hljs-comment"># http://127.0.0.1:8081</span>
<span class="hljs-meta">@index.route(<span class="hljs-params"><span class="hljs-string">'/'</span></span>)</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">home</span>():
res = <span class="hljs-built_in">dict</span>(
name=<span class="hljs-string">"有勇氣的牛排"</span>
)
<span class="hljs-keyword">return</span> render_template(<span class="hljs-string">'index.html'</span>, result=res)
</code></div></pre>
<h2><a id="3__GETPOST_130"></a>3 获取参数 GET、POST</h2>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># 参数测试</span>
<span class="hljs-comment"># http://127.0.0.1:8081/param_test</span>
<span class="hljs-meta">@m_test.route(<span class="hljs-params"><span class="hljs-string">'/param_test'</span>, methods=[<span class="hljs-string">'GET'</span>, <span class="hljs-string">'POST'</span>]</span>)</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">param_test</span>():
<span class="hljs-comment"># 获取当前请求的方法类型</span>
method = request.method
data = <span class="hljs-built_in">dict</span>(
nickname=<span class="hljs-string">"有勇氣的牛排"</span>,
url=<span class="hljs-string">"https://www.couragesteak.com/"</span>,
)
<span class="hljs-comment"># 根据不同的请求方法获取参数</span>
<span class="hljs-keyword">if</span> method == <span class="hljs-string">'GET'</span>:
<span class="hljs-comment"># 从GET请求中获取参数</span>
<span class="hljs-built_in">id</span> = request.args.get(<span class="hljs-string">'id'</span>, <span class="hljs-literal">None</span>)
data[<span class="hljs-string">'id'</span>] = <span class="hljs-built_in">id</span>
<span class="hljs-keyword">return</span> render_template(<span class="hljs-string">'test_param.html'</span>, data=data)
<span class="hljs-keyword">elif</span> method == <span class="hljs-string">'POST'</span>:
<span class="hljs-comment"># 从POST请求中获取参数</span>
<span class="hljs-built_in">id</span> = request.form.get(<span class="hljs-string">'id'</span>, <span class="hljs-literal">None</span>)
data[<span class="hljs-string">'id'</span>] = <span class="hljs-built_in">id</span>
<span class="hljs-keyword">else</span>:
param = <span class="hljs-string">'No valid method'</span>
<span class="hljs-keyword">return</span> jsonify(data)
</code></div></pre>
<h2><a id="4__164"></a>4 重定向</h2>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># 重定向 路由</span>
<span class="hljs-comment"># http://127.0.0.1:8081/redirect_with_param</span>
<span class="hljs-meta">@m_test.route(<span class="hljs-params"><span class="hljs-string">'/redirect_with_param'</span></span>)</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">redirect_with_param</span>():
result = <span class="hljs-built_in">dict</span>(
name=<span class="hljs-string">"有勇氣的牛排"</span>
)
<span class="hljs-comment"># return redirect(url_for('param_test'))</span>
<span class="hljs-keyword">return</span> redirect(<span class="hljs-string">'/'</span>)
</code></div></pre>
<h2><a id="5__178"></a>5 模板</h2>
<p>这里使用render_template,也可以使用其他模板,比如 Jinja2</p>
<p>py</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># http://127.0.0.1:8081</span>
<span class="hljs-meta">@index.route(<span class="hljs-params"><span class="hljs-string">'/'</span></span>)</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">home</span>():
res = <span class="hljs-built_in">dict</span>(
name=<span class="hljs-string">"有勇氣的牛排"</span>
)
<span class="hljs-keyword">return</span> render_template(<span class="hljs-string">'index.html'</span>, result=res)
</code></div></pre>
<p>html模板</p>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/"</span>></span>首頁<span class="hljs-tag"></<span class="hljs-name">a</span>></span>
<span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/login"</span>></span>登錄<span class="hljs-tag"></<span class="hljs-name">a</span>></span>
<span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/param_test"</span>></span>參數測試<span class="hljs-tag"></<span class="hljs-name">a</span>></span>
<span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/logout"</span>></span>退出登錄<span class="hljs-tag"></<span class="hljs-name">a</span>></span>
<span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/js/jquery-3.4.1.min.js"</span>></span>打開靜態文件<span class="hljs-tag"></<span class="hljs-name">a</span>></span>
<span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/redirect_with_param"</span>></span>重定向測試<span class="hljs-tag"></<span class="hljs-name">a</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
首頁: {{ result.name }}
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/079be1d60551652436c7b06ff9a1a906.png" alt="flask render_template模板" /></p>
<h2><a id="6__404500_213"></a>6 报错路由 404/500</h2>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># 定义404错误页面</span>
<span class="hljs-meta">@app.errorhandler(<span class="hljs-params"><span class="hljs-number">404</span></span>)</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">not_found</span>(<span class="hljs-params">e</span>):
<span class="hljs-keyword">return</span> render_template(<span class="hljs-string">'error_404.html'</span>)
<span class="hljs-comment"># 定义500错误页面</span>
<span class="hljs-meta">@app.errorhandler(<span class="hljs-params"><span class="hljs-number">500</span></span>)</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">internal_error</span>():
<span class="hljs-keyword">return</span> render_template(<span class="hljs-string">'error_500.html'</span>)
</code></div></pre>
<p>详细文档:</p>
<p>https://dormousehole.readthedocs.io/en/latest/quickstart.html</p>
留言