当前位置: 首页 > 后端技术 > Python

pythonflask快速入门的简单web框架

时间:2023-03-26 15:57:41 Python

介绍Python可以做很多事情,虽然它的强项在于向量运算、机器学习和深度学习。但是在某些时候,我们还是需要使用python对外提供web服务。比如我们现在有一个用python写的模型算法。该模型算法需要接收前端的输入,然后进行仿真运算,最后得到最终的输出。这个过程是一个典型的网络服务。除了使用java或者nodejs来搭建web服务器,我们可以使用python自带的web框架来实现这个目的。在减少技术栈的同时,我们还可以实现代码逻辑的统一。为什么不这样做呢?其实python的web框架有很多种,比如django、flask等等。在本系列文章中,我们将介绍Flask这个轻量级的Web框架。web框架的重要部分相信大家都用过很多web框架,从java的springMVC到nodejs的express、koa,有的功能复杂,有的功能简单。但不管它们的功能是什么,最重要也是最基本的功能就是提供web服务,也就是说可以接收HTTP或者HTTPS的请求,并返回相应的数据。该功能通常包括核心路由跳转功能。有了这个核心功能,web框架就基本可以正常运行了。配合现在流行的前后端分离技术,一切水到渠成。如果不想前后端分离,那么web框架还需要涉及到页面的渲染技术。一般来说,前端页面的呈现形式是使用模板引擎。然后再加上数据库、缓存、消息队列、静态资源、日志、调试等功能,一个完整的web框架就完成了。Flask虽然是一个轻量级的web框架,但是该有的功能它都有。其核心是提供对web路由的支持,支持Jinja的模板语言。flask快速入门flask是一个非常简洁优雅的web框架,flask需要Python3.7及以上版本的支持。为了区分python不同的开发环境,我们在使用flask的时候,可以使用python自带的venv创建不同的虚拟环境。venv和conda的env很像,都是用来创建虚拟环境,从而实现不同环境的分离。使用venv非常简单。如果你使用的开发工具是pycharm,那么在创建pythonflask项目时,会自动选择对应的虚拟环境创建工具。这里我们选择使用venv自动创建。当然你也可以使用如下命令手动创建venv:$mkdirlearn-flask$cdlearn-flask$python3-mvenvvenv创建好venv后,使用以下命令激活这个env:.venv/bin/activatevenvinstall完成后,我们可以使用如下命令来安装flask:pipinstallFlask安装完成后,可以在python项目site-packages中找到flask对应的依赖包:可以看到除了flask还有其他的包party依赖包,这些可以在后续的flask应用程序中使用。Flask的第一个应用在flask的依赖包全部安装好之后,我们就可以写一个最简单的web应用了。我们将这个应用程序命名为first.py:fromflaskimportFlaskapp=Flask(__name__)@app.route('/')deffirst():return"

Thisismyfirstflaskprogram!

"if__name__=='__main__':app.run()和plainpython程序的区别在于这里我们先实例化一个Flask对象,然后在第一个方法上用类似注解的方式定义一个路由。程序编写完成后,如果在pycharmIDE中,右键运行,可以得到如下内容:FLASK_APP=first.pyFLASK_ENV=developmentFLASK_DEBUG=0在文件夹/Users/data/git/ddean2009/learn-flask/Users/data/git/ddean2009/learn-flask/venv/bin/python-mflaskrun*ServingFlaskapp'first.py'*调试模式:关闭警告:这是一个开发服务器。不要在生产部署中使用它。请改用生产WSGI服务器。*运行在http://127.0.0.1:5000可以看到IDE为我们设置了几个环境变量,分别是FLASK_APP:表示要运行的app名称。FLASK_ENV:表示当前运行环境是开发环境还是线上环境。FLASK_DEBUG表示是否处于调试模式。最后我们访问默认的http://127.0.0.1:5000,可以得到如下内容:说明整个程序运行成功。如果想通过命令行执行flask应用,可以使用如下命令:flask--appfirstrun注意这里我们添加了--app参数来指定要运行的app的名称。如果未指定,flask将查找名为app.py或wsgi.py的文件。如果你有这两个文件,可以直接用flaskrun运行。这里的flask相当于python-mflask。默认情况下,只能通过本地浏览器访问Flask应用程序。如果想远程访问,可以指定访问主机,如下:flaskrun--host=0.0.0.0到这里,我们的一个基本最简单的flaskweb应用就完成了。什么?你还想了解更多吗?别着急,下面就为大家详细介绍一些Web应用必须了解的知识。Flask中的路由也叫Routing,是Web应用的灵魂,通过路由定义各种URL和访问路径。在flask中,可以使用@app.route定义路由。@app.route类似于注解,可以放在python方法上。route中可以定义route的名字,route的名字可以和方法的名字不一样:@app.route('/test')deftest123():return'我是测试'路由的名字也可以是动态的,可以取一个和注解方法中的参数名相同的参数名作为路由的参数,用尖括号括起来,如下所示:frommarkupsafeimportescape@app.route('/student/')defwhat_is_your_name(name):returnf'你的名字是:{escape(name)}'这里的方法体中,我们调用了python的f函数对字符串进行格式化.在内部,为了防止web输入端的恶意注入,这里参考了markupsafe的escape方法,可以对输入的字符串进行转义,从而避免恶意攻击。除了在路径中指定参数外,我们还可以自己指定参数的类型。在flask中,path参数可以设置为以下几种类型:typedescriptionstring默认类型,可以接收除/int以外的任意字符串可以接收正整数float可以接收正浮点数path类似于string,但是可以接收/uuid接收uuidstring比如我们要传入一个路径,那么我们可以定义为路径类型:@app.route('/path/')defwhat_is_your_path(subpath):returnf'你的路径is:{escape(subpath)}'上面我们提到了string和path的区别,就是path可以接收/,而string不能。那么/在flask中有什么特殊含义吗?我们知道/是用来做路径分割的,在flask中包含/和不包含/还是有一定区别的。以下面的代码为例:@app.route('/withslash/')defwith_slash():return'Thisiswithslash'@app.route('/withoutslash')defwith_out_slash():return'Thisis'withslash没有斜线的定义有一个斜线后缀,所以无论你访问/withslash还是/withslash/,你都会被重定向到withslash/。但是因为withoutslash没有斜杠,所以只能访问/withoutslash,不能访问/withoutslash/,否则可能会得到404“NotFound”错误。不同的http方法@app.route默认对外提供GET方法。如果想对外提供一些不同的http方法,可以使用@app.route中的方法:@app.route('/diffMethod',methods=['GET','POST'])defdiff_method():ifrequest.method=='POST':return'thisispost'else:return'thisisget'当然也可以使用@app。get或@app.post对不同方法的单独请求:@app.get('/getMethod')defget_method():return'thisisget'@app.post('/postMethod')defpost_method():return'这是一个帖子'静态文件在web应用中,一些静态资源是必不可少的,比如图片,js或者css。这些静态资源可以看作是一种特殊的路由规则。在flask中,这可以通过创建一个特殊的静态目录来实现。如下图:url_for('static',filename='style.css')这里我们使用了url_for方法,其实就是用来构造对应方法的url。可以引用下面的例子来阐明对url_for的深入理解。urL_for的第一个参数是方法名,后面是url中定义的变量,如果url中没有这个变量,则会附加到url中作为参数:@app.route('/')defindex():return'index'@app.route('/login')deflogin():return'login'@app.route('/user/')defprofile(username):returnf'{username}\'sprofile'withapp.test_request_context():print(url_for('index'))print(url_for('login'))print(url_for('login',next='/'))print(url_for('profile',username='JohnDoe'))输出如下://login/login?next=//user/John%20Doe使用模板如果我们只是使用return返回简单的字符串或变量,那么它肯定不能满足现代应用的需要。为了实现复杂的页面功能,我们通常会使用模板。Flask使用模板语言Jinja2。如何使用模板?当我们返回时,我们可以使用render_template方法:fromflaskimportrender_template@app.route('/template/')defuse_template(name=None):returnrender_template('hello.html',name=name)其中hello.html是模板文??件的名称,name是模板文件中定义的变量。综上所述,以上就是flask的基本使用。掌握了这些内容后,相信大家可以使用flask制作一个简单的web应用了。