首先简单介绍下Flask,它是一个轻量级的web应用框架。相比于Django框架来说,非常小巧灵活,耦合性低,可以写多个插件。FLask虽轻,但Flask非常强,它具有内核和扩展的特点,让FLask 拥有“快速”开发各种类型应用的能力!关于更多Flask介绍,可以看官方文档的介绍。
关于Django框架,后续也会持续推出Django相关的知识!
注:本专栏适合对Python有一定基础的同学,基础知识在文中不一一描述,感谢理解。
一、环境部署
如果你的pycharm是专业版,那么可以直接新建Flask项目,一键新建,两分钟等待,新建完成后项目安装的包也都帮你安装好了。
app.py模块也建成一个hello_world的最简单的项目。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
终端敲flask run,即可运行app.
如果是社区版,可以手动新建py项目,安装Flask包,新建app.py文件,输入上述代码。直接终端运行,就可以了。
这里需要区分的是开发环境和生产环境。专业版的直接是开发环境和debug模块。社区版的是生产环境且debug模式是关闭的,如果需要切换,终端命令行输入set FLASK_ENV=development,就能切换到开发环境。如果你想切换debug模式,可以在插入一段
if __name__ == '__main__':
app.debug = True # 设置debug模式
app.run()
或者
if __name__ == '__main__':
app.run(debug=True)
二、路由
1. 注册路由
注册路由有两种
@app.route
如上述的,访问地址通过添加装饰器@app.route来实现,一般都是这么用
add_url_rule
参看源码看源码里我加的注释,其实就是@app.route来调用add_url_rule()方法的。
def route(self, rule: str, **options: t.Any) -> t.Callable:
"""Decorate a view function to register it with the given URL
rule and options. Calls :meth:`add_url_rule`, which has more
details about the implementation.
.. code-block:: python
@app.route("/")
def index():
return "Hello, World!"
See :ref:`url-route-registrations`.
The endpoint name for the route defaults to the name of the view
function if the ``endpoint`` parameter isn't passed.
The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` and
``OPTIONS`` are added automatically.
:param rule: The URL rule string.
:param options: Extra options passed to the
:class:`~werkzeug.routing.Rule` object.
"""
def decorator(f: t.Callable) -> t.Callable:
endpoint = options.pop("endpoint", None)
# 这是route就是一个装饰器,它调用了add_url_rule方法。
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator
具体实现如下:
def hello_world():
return "hello world!"
app.add_url_rule('/hello_world', view_func=hello_world)
2.url
变量的传递
url变量的数据类型可以有多种,int,string,float,path,uuid这里我用string类型在举例,其他的,小伙伴可以试试
那么废话不多说,show my code!
@app.route('/common/<string:route>', endpoint="newroute", methods=["GET", "POST"])
def api(route):
if route == "querystring":
return f"如果route是querystring,那就返回。"
url = url_for("newroute", route=route)
return f"浏览器传过来的变量是{route},url是{url}"
这里我们可以把url的某一部分替换成string:route,可以在url里加入变量,并且用了转换器string:,这个变量就可以理解为它是一个关键字参数,这个参数把它传给了api函数,告诉api,我给你api传了一个string类型的关键字参数,你后面调用它只能是string类型的。
url_for(),endpoint,methods
url_for()是一种反向机制。通过浏览器请求,反向获取视图函数的url地址。
url_for反转函数的好处有很多,这里我觉得非常好用的是你可以只在一个地方改变url,而不用在项目工程里到处找。如果我的应用是放在url根路径之外的地方,那么url_for()能够帮我巧妙处理。
@app.route('/common/<string:route>', endpoint="newroute", methods=["GET", "POST"])
def api(route):
if route == "querystring":
return f"如果route是querystring,那就返回。"
url = url_for("newroute", route=route)
return f"浏览器传过来的变量是{route},url是{url}"
with app.test_request_context():
print(url_for('newroute', route='username'))
另外这里的endpoint就是一个别名,传给api后,如果用到url_for()反向获取url,需要调用它的endpoint,如果没有设置endpoint,那么就调用之前的route。
如果需要给你的接口定义接口方法,加入methods参数既可。如上图,我加上了methods=[“GET”,“POST”],调用的时候分别用get,post都能成功调用。