编程学习网 > 编程语言 > Python > flask框架用什么语言?Python flask框架详细解答!
2022
10-21

flask框架用什么语言?Python flask框架详细解答!


Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引则使用 Jinja2 。Flask使用 BSD 授权。今天编程学习网和大家聊聊flask框架的安装流程以及对框架的整体介绍,希望对大家有所帮助!一起和小编看看详细内容吧!

安装flask

首先我们来安装Flask。最简单的办法就是使用pip。

1
pipinstallflask

然后打开一个Python文件,输入下面的内容并运行该文件。然后访问localhost:5000,我们应当可以看到浏览器上输出了hello world。

1
2
3
4
5
6
7
fromflaskimportFlask
app=Flask(__name__)
@app.route('/')
defhello_world():
    return'hello world'
if__name__=='__main__':
    app.run(host='127.0.0.1',port=5000)

调试模式

我们修改代码中的输出,然后查看浏览器上是否有变化。如果你照做的话,可以看到什么变化都没有。其实Flask内置了调试模式,可以自动重载代码并显示调试信息。这需要我们开启调试模式,方法很简单,设置FLASK_DEBUG环境变量,并将值设置为1。或者设置app.debug=True

1
2
3
4
5
6
7
8
9
10
11
12
fromflaskimportFlask
 
app=Flask(__name__)
app.debug=True
@app.route('/')
defhello_world():
    return'Hello World!'
@app.route('/login')
deflogin():
    return'Login'
if__name__=='__main__':
    app.run()

然后再次运行程序,会看到有这样的输出。这时候如果再次修改代码,会发现这次Flask会自动重启。

* Restarting with stat
 * Debugger is active!
 * Debugger PIN: 157-063-180
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

路由

在上面的例子里可以看到路由的使用。如果了解Spring Web MVC的话,应该对路由很熟悉。路由通过使用Flask的app.route装饰器来设置,这类似Java的注解。

1
2
3
4
5
6
7
@app.route('/')
defindex():
    return'Index Page'
 
@app.route('/hello')
defhello():
    return'Hello, World'

路径变量

如果希望获取/article/1这样的路径参数,就需要使用路径变量。路径变量的语法是/path/<converter:varname>。在路径变量前还可以使用可选的转换器,有以下几种转换器。

转换器 作用
string 默认选项,接受除了斜杠之外的字符串
int 接受整数
float 接受浮点数
path 和string类似,不过可以接受带斜杠的字符串
any 匹配任何一种转换器
uuid 接受UUID字符串

下面是Flask官方的例子。

1
2
3
4
5
6
7
8
9
@app.route('/user/<username>')
defshow_user_profile(username):
    # show the user profile for that user
    return'User %s'%username
 
@app.route('/post/<int:post_id>')
defshow_post(post_id):
    # show the post with the given id, the id is an integer
    return'Post %d'%post_id

构造URL

在Web程序中常常需要获取某个页面的URL,在Flask中需要使用url_for('方法名')来构造对应方法的URL。下面是Flask官方的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>>fromflaskimportFlask, url_for
>>> app=Flask(__name__)
>>> @app.route('/')
...defindex():pass
...
>>> @app.route('/login')
...deflogin():pass
...
>>> @app.route('/user/<username>')
...defprofile(username):pass
...
>>> with app.test_request_context():
... printurl_for('index')
... printurl_for('login')
... printurl_for('login',next='/')
... printurl_for('profile', username='John Doe')
...
/
/login
/login?next=/
/user/John%20Doe

HTTP方法

如果需要处理具体的HTTP方法,在Flask中也很容易,使用route装饰器的methods参数设置即可。

1
2
3
4
5
6
7
8
fromflaskimportrequest
 
@app.route('/login', methods=['GET','POST'])
deflogin():
    ifrequest.method=='POST':
        do_the_login()
    else:
        show_the_login_form()

静态文件

Web程序中常常需要处理静态文件,在Flask中需要使用url_for函数并指定static端点名和文件名。在下面的例子中,实际的文件应放在static/文件夹下。

1
url_for('static', filename='style.css')

模板生成

Flask默认使用Jinja2作为模板,Flask会自动配置Jinja 模板,所以我们不需要其他配置了。默认情况下,模板文件需要放在templates文件夹下。

使用 Jinja 模板,只需要使用render_template函数并传入模板文件名和参数名即可。

1
2
3
4
5
6
fromflaskimportrender_template
 
@app.route('/hello/')
@app.route('/hello/<name>')
defhello(name=None):
    returnrender_template('hello.html', name=name)

相应的模板文件如下。

1
2
3
4
5
6
7
<!doctype html>
<title>Hello from Flask</title>
{% if name %}
  <h1>Hello {{ name }}!</h1>
{% else %}
  <h1>Hello, World!</h1>
{% endif %}

日志输出

Flask 为我们预配置了一个 Logger,我们可以直接在程序中使用。这个Logger是一个标准的Python Logger,所以我们可以向标准Logger那样配置它。

app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('An error occurred')

处理请求

在 Flask 中获取请求参数需要使用request等几个全局对象,但是这几个全局对象比较特殊,它们是 Context Locals ,其实就是 Web 上下文中局部变量的代理。虽然我们在程序中使用的是全局变量,但是对于每个请求作用域,它们都是互不相同的变量。理解了这一点,后面就非常简单了。

Request 对象

Request 对象是一个全局对象,利用它的属性和方法,我们可以方便的获取从页面传递过来的参数。

method属性会返回HTTP方法的类似,例如post和get。form属性是一个字典,如果数据是POST类型的表单,就可以从form属性中获取。下面是 Flask 官方的例子,演示了 Request 对象的method和form属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
fromflaskimportrequest
 
@app.route('/login', methods=['POST','GET'])
deflogin():
    error=None
    ifrequest.method=='POST':
        ifvalid_login(request.form['username'],
                       request.form['password']):
            returnlog_the_user_in(request.form['username'])
        else:
            error='Invalid username/password'
    # the code below is executed if the request method
    # was GET or the credentials were invalid
    returnrender_template('login.html', error=error)

如果数据是由GET方法传送过来的,可以使用args属性获取,这个属性也是一个字典。

1
searchword=request.args.get('key', '')

文件上传

利用Flask也可以方便的获取表单中上传的文件,只需要利用 request 的files属性即可,这也是一个字典,包含了被上传的文件。如果想获取上传的文件名,可以使用filename属性,不过需要注意这个属性可以被客户端更改,所以并不可靠。更好的办法是利用werkzeug提供的secure_filename方法来获取安全的文件名。

1
2
3
4
5
6
7
8
fromflaskimportrequest
fromwerkzeug.utilsimportsecure_filename
 
@app.route('/upload', methods=['GET','POST'])
defupload_file():
    ifrequest.method=='POST':
        f=request.files['the_file']
        f.save('/var/www/uploads/'+secure_filename(f.filename))

Cookies

Flask也可以方便的处理Cookie。使用方法很简单,直接看官方的例子就行了。下面的例子是如何获取cookie。

1
2
3
4
5
6
7
fromflaskimportrequest
 
@app.route('/')
defindex():
    username=request.cookies.get('username')
    # 使用 cookies.get(key) 代替 cookies[key] 避免
    # 得到 KeyError 如果cookie不存在

如果需要发送cookie给客户端,参考下面的例子。

1
2
3
4
5
6
7
fromflaskimportmake_response
 
@app.route('/')
defindex():
    resp=make_response(render_template(...))
    resp.set_cookie('username','the username')
    returnresp

重定向和错误

redirect和abort函数用于重定向和返回错误页面。

1
2
3
4
5
6
7
8
9
10
fromflaskimportabort, redirect, url_for
 
@app.route('/')
defindex():
    returnredirect(url_for('login'))
 
@app.route('/login')
deflogin():
    abort(401)
    this_is_never_executed()

默认的错误页面是一个空页面,如果需要自定义错误页面,可以使用errorhandler装饰器。

1
2
3
4
5
fromflaskimportrender_template
 
@app.errorhandler(404)
defpage_not_found(error):
    returnrender_template('page_not_found.html'),404

响应处理

默认情况下,Flask会根据函数的返回值自动决定如何处理响应:如果返回值是响应对象,则直接传递给客户端;如果返回值是字符串,那么就会将字符串转换为合适的响应对象。我们也可以自己决定如何设置响应对象,方法也很简单,使用make_response函数即可。

1
2
3
4
5
@app.errorhandler(404)
defnot_found(error):
    resp=make_response(render_template('error.html'),404)
    resp.headers['X-Something']='A value'
    returnresp

Sessions

我们可以使用全局对象session来管理用户会话。Sesison 是建立在 Cookie 技术上的,不过在 Flask 中,我们还可以为 Session 指定密钥,这样存储在 Cookie 中的信息就会被加密,从而更加安全。直接看 Flask 官方的例子吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
fromflaskimportFlask, session, redirect, url_for, escape, request
 
app=Flask(__name__)
@app.route('/')
defindex():
    if'username'insession:
        return'Logged in as %s'%escape(session['username'])
    return'You are not logged in'
@app.route('/login', methods=['GET','POST'])
deflogin():
    ifrequest.method=='POST':
        session['username']=request.form['username']
        returnredirect(url_for('index'))
    return'''
        <form method="post">
            <p><input type=text name=username>
            <p><input type=submit value=Login>
        </form>
    '''
@app.route('/logout')
deflogout():
    # remove the username from the session if it's there
    session.pop('username',None)
    returnredirect(url_for('index'))
# set the secret key.  keep this really secret:
app.secret_key='A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'

模板简介

这里简单的介绍一下Jinja 模板的使用方法,详细资料直接看原文档吧。

模板标签

其实Jinja 模板和其他语言和框架的模板类似,反正都是通过某种语法将HTML文件中的特定元素替换为实际的值。如果使用过JSP、Thymeleaf 等模板,应该可以非常容易的学会使用 Jinja模板。

其实从上面的例子中我们应该可以看到Jinja 模板的基本语法了。代码块需要包含在{% %}块中,例如下面的代码。

1
2
3
4
5
6
7
8
{% extends 'layout.html' %}
{% block title %}主页{% endblock %}
{% block body %}
 
    <div class="jumbotron">
        <h1>主页</h1>
    </div>
{% endblock %}

双大括号中的内容不会被转义,所有内容都会原样输出,它常常和其他辅助函数一起使用。下面是一个例子。

1
<a class="navbar-brand" href={{ url_for('index') }}>Flask小例子</a>

继承

模板可以继承其他模板,我们可以将布局设置为父模板,让其他模板继承,这样可以非常方便的控制整个程序的外观。

例如这里有一个layout.html模板,它是整个程序的布局文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html>
<html>
<head>
    <metacharset="UTF-8">
    <metahttp-equiv="X-UA-Compatible"content="IE=edge">
    <metaname="viewport"content="width=device-width, initial-scale=1">
    <title>{% block title %}{% endblock %}</title>
    <linkrel="stylesheet"href="{{ url_for('static',filename='css/bootstrap.css') }}"rel="external nofollow"/>
    <linkrel="stylesheet"href="{{ url_for('static',filename='css/bootstrap-theme.css') }}"rel="external nofollow"/>
 
</head>
<body>
<divclass="container body-content">
    {% block body %}{% endblock %}
</div>
<divclass="container footer">
    <hr>
    <p>这是页脚</p>
<scriptsrc="{{ url_for('static',filename='js/jquery.js') }}"></script>
<scriptsrc="{{ url_for('static',filename='js/bootstrap.js') }}"></script>
</body>
</html>

其他模板可以这么写。对比一下面向对象编程的继承概念,我们可以很容易的理解。

1
2
3
4
5
6
7
8
9
{% extends 'layout.html' %}
{% block title %}主页{% endblock %}
{% block body %}
 
    <div class="jumbotron">
        <h1>主页</h1>
        <p>本项目演示了Flask的简单使用方法,点击导航栏上的菜单条查看具体功能。</p>
    </div>
{% endblock %}

控制流

条件判断可以这么写,类似于JSP标签中的Java 代码,{% %}中也可以写Python代码。下面是Flask官方文档的例子。

1
2
3
4
5
6
7
<div class=metanav>
  {% if not session.logged_in %}
    <a href="{{ url_for('login') }}" rel="external nofollow" >log in</a>
  {% else %}
    <a href="{{ url_for('logout') }}" rel="external nofollow" >log out</a>
  {% endif %}
  </div>

循环的话可以这么写,和在Python中遍历差不多。

1
2
3
4
5
6
7
8
9
10
11
12
<tbody>
     {% for key,value in data.items() %}
         <tr>
            <td>{{ key }}</td>
             <td>{{ value }}</td>
         </tr>
     {% endfor %}
        <tr>
            <td>文件</td>
            <td></td>
        </tr>
 </tbody>

需要注意不是所有的Python代码都可以写在模板里,如果希望从模板中引用其他文件的函数,需要显式将函数注册到模板中。

以上就是“flask框架用什么语言?Python flask框架详细解答!”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网



扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取