文章目录
一、Flask简介
Flask是一个基于Python语言的轻量级web开发框架,通过 pip 命令即可快速安装
pip install flask
推荐参考书目:《Flask Web开发:基于Python的Web应用开发实战》
二、启动服务器
编写简单代码就可以快速构建Web服务
from flask import Flask
app = Flask(__name__)
# 主页
@app.route('/')
def index():
return "Hi Flask!"
if __name__ == '__main__':
app.debug=True # 默认开启debug模式
# host=0.0.0.0 port=5000
app.run('0.0.0.0', 5000)
运行以上.py
文件将在本地5000端口开启Flask服务器
概念补充说明 —— 装饰器语法与路由
python装饰器语法
用函数封装一个函数
在函数A前使用 @anotherFunctionName,指将该函数A作为参数传入anotherFunctionName,由anotherFunctionName修饰运行
route 即路由,在flask中以装饰器语法的形式使用的。以👇代码为例:@app.route('/')
用来修饰index()
函数,表示根目录页面的内容将由index()
函数的返回值决定
# 主页
@app.route('/')
def index():
return "Hi Flask!"
实现动态路由
在Flask中也可以很方便的实现动态路由(随路由变化而响应不同页面内容)
@app.route('/user/<name>') # <name> 就是可变部分
def user(name): # name作为函数的参数被获得
return '<h1>Hello,{}!</h1>'.format(name)
使用动态路由,就可以很轻松的为任意用户“定制”个性化页面了
三、配置跨域访问
当使用前后端分离架构时,往往会遇到跨域请求资源的情况。如果在浏览器控制台看到这样的错误:CORS policy
Access to XMLHttpRequest at ‘xxx’ from origin ‘xxx’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
说明需要为服务器配置允许跨域访问。在 Flask 中,已有成熟第三方库可以解决这个问题。你需要这样👇修改你的.py
代码
from flask_cors import * # pip install flask_cors
app = Flask(__name__)
CORS(app, resources=r'/*') # 允许任意主机请求资源
四、静态文件路径
服务器在渲染页面时总有用到静态文件的时候。当为Flask准备静态文件时,有着严格的目录格式规定:
文件夹
| - app.py (flask APP - 你的flask服务器.py文件)
| - templates (模板文件夹 - 模板 会在 五、模板渲染 中提到)
| | - a.html (网页模板a)
| | - b.html (网页模板b)
| | - c.html (网页模板c)
| ...
|
| - static (静态文件文件夹)
| - images (图片文件夹)
| - srcipts (js文件夹)
| - styles (css文件夹)
...
templates和static目录是必须的,且要和你的服务器.py文件在同一目录下。至于它们里面内容,是可变的。为了使用静态文件,对你的代码进行一点修改
# app = Flask(__name__)
# 指定静态文件目录
app = Flask(__name__,static_url_path='/static/',template_folder='templates')
五、模板渲染
使用同一套模板渲染不同的页面,对于传统静态网页开发而言,模板渲染的优势不言而喻。还记得 templates 文件夹吗,它被用于放置网页模板。
使用render_template()
方法,可以快速将文件夹中的模板渲染成页面👇
from flask render_template
@app.route('/<user>')
def user_page(user):
return render_template("user.html",user = user)
网页模板的写法
user作为参数被传给模板。想在模板中使用参数,你的模板页面(模板页面是html+css+js格式)需要遵循如下语法,即用双花括号 {{}} 包裹你的变量
<div>
{{user}}
</div>
此外,模板中还可以使用简单的控制语句:分支 and 循环
ps:如果模板 {{}} 语法和其他前端库冲突(比如 vue ),可以用 {% raw %}
和 {% endraw %}
分割不同部分,告诉 jinja2(Flask的模板引擎)它的职责范围:
{% raw %}
<div>
{{vue代码}}
</div>
{% endraw %}
六、实现GET/POST接口
这里直接给出两个demo示例
GET
from flask import request
import json
@app.route('/api/get_name', methods=['GET'])
def get_name():
'''
comment here
'''
# value=request.args.get('key') # 想用GET传参?你可以这样获取参数
result=doSomething();
# 把结果格式化为json形式回传
return json.dumps({'result':result},ensure_ascii=False)
POST
from flask import request
import json
@app.route('/api/post_sth', methods=['POST'])
def post_sth():
'''
comment here
'''
value=request.form['key'] # 获取表单传来的数据
result=doSomething()
# 把结果格式化为json形式回传
return json.dumps({'result':result},ensure_ascii=False)
七、使用 pymysql 操纵 MySQL 数据库
链接数据库的语法是固定的,但要注意MySQL版本的问题。5.7和8.0使用不同的链接语法
import pymysql
db = pymysql.connect(host='主机ip', user='用户名', password='密码', database='数据库名') # MySQL 5.7
# db = pymysql.connect("主机ip","用户名","密码","数据库名" ) # MySQL 8.0
cursor = db.cursor() # 创建一个游标对象
sql="""要执行的SQL语句;"""
cursor.execute(sql) # 执行语句
data=cursor.fetchall() # 获取元组形式查询结果 .fatchone()方法获取单条数据
db.close() # 关闭连接
附:Flask常用代码生成器
Flask的常用功能语法框架大都固定。为了方便、快速构建 flask 应用,写了一个Flask基础代码生成器:收录了像GET/POST接口、数据库操作等固定模板;选定demo一键复制,欢迎试用😋