首页 > Python笔记 阅读数:23

Python Flask框架用法完全攻略

Flask 框架是 Python 中一个比较重要的框架,在开发网站中极具优势,下面对 Flask 框架的功能进行具体介绍。

FIask框架的第一个程序——Hello World

Flask 框架的第一个程序,具体代码如下:
from flask import Flask        #引入Flask
app = Flask(__name__)          #创建一个Flask实例
@app.route('/')                #将网址映射到这个函数上
def hello_world():
    return 'Hello World!'
if  __name__  == '__main__':
app.run()                      #入口,执行
把该程序保存为 hello.py 或者其他,但不要与 flask.py 产生冲突。这样,通过访问 http://127.0.0.1:5000/,就会看见“Hello World!”问候。

FIask框架的应用

1) 路由

路由是在 MVC 架构下 Web 网站框架中一个很重要的概念,表示通过用户请求的 URL 找出其对应的处理函数。

在 Flask 中,route( ) 装饰器会把一个函数绑定到 URL 上,具体代码如下:
@app.route('/index')
def index():
    return 'index page!'
这样,在访问 /index 时,页面上就会显示出“index page!”字样。不仅如此,还可以通过构建路由传递参数。

这种方式将参数直接传递给函数,也可以指定参数的类型,格式为<converter:variable_name>。Flask 传递参数,具体代码如下:
@app.route('/user/<int:id>')
def show_id(id):
    return  'id_type:'+type(id)

转换器类型如表 1 所示。
表 1:转换器类型
转换器类型 说明
int 接收整数
float
同int,但是接收浮点数
path 和默认的相似,但也接收斜线

2) 构造URL

Flask 不仅可以匹配到对应的 URL,也可以生成 URL。使用 url_for( ) 函数,不仅可以接收函数名字作为第一个参数,也可以接收 URL 规则中的变量作为参数传入。

构造 URL 的代码如下:
from flask import Flask,url_for
app=Flask(__name__)
@app.route('/')
def index():
    pass
@app.route('/example')
def index2():
    pass
@app.route('/example/<username>')
def index3(username):
    return url_for(index)
with app.test_request_context():
    print(url_for('index'))
    print(url_for('index2'))
    print(url_for('index3', username='abc'))
输出结果如下:

/
/example
/example/abc

3) 请求处理之request库

request 库中的方法,具体代码如下:
from flask import request              #导入 request 库
request.args.get ("key")               #用于获取请求的URL中的参数key的值
request.form.get ("key", type=str, default=None) # 用于获取表单中传入的参数
request.values.get ("key")             #用于获取所有参数
request.respond                        #用于获取其请求方式

4) 重定向、跳转与错误

跳转多用于旧网址在废弃前转向新网址,以保证用户的访问,表示页面的永久性转移。而重定向表示页面的展示性转移,通常使用 Flask 下的 redirect( ) 方法来实现。

具体代码如下:
from flask import Flask, request, redirect, url_for
app=Flask(__name__)
@app.route('/')
def index():
    return redirect(url_for('index2'))
@app.route('/index2')
def index2():
    return 'index2'
def index3():
abort(404)
app.run(port=5001, debug=True)

当访问到/目录时,自动跳转到 /index 下 abort 的使用:在代码中使用 abort(code) 会放弃请求并返回错误代码 code,之后的语句不会再执行。在默认情况下,错误代码会显示一个黑白的错误页面。如果要定制错误页面,则可以使用 errorhandler( ) 装饰器。

具体代码如下:
from flask import render_template
@app.errorhandler(404)
def page_not_found(error):
    return render_template('page not found.html'), 404

注意:render_template( ) 调用之后的 404。这告诉 Flask,该页面的错误代码是 404,即没有找到。默认代码是 200,表示一切正常。

5) GET和POST请求传参

GET 和 POST 请求传参,具体代码如下:
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':    #如果请求的方式是POST,则执行如下函数
        login()
    else : #否则执行如下函数
        cancel()
在默认情况下,路由只回应 GET 请求,但是可以通过修改 route( ) 方法中的 methods 参数来改变这个行为。

6) Cookie与Session在FIask中的使用

Cookie 是存储在用户本地终端上的数据,通常是指某些网站为了辨别用户身份,进行 Session 跟踪而存储在用户本地终端上的数据(通常经过加密)。接下来展示如何在 Flask 中设置及删除 Cookie。

具体代码如下:
from flask import request
app=Flask(__name__)
@app.route('/')
def index():
    username = request.cookies.get('username') 
#设置 Cookie
@app.route('/')
def index():
    resp = make_response("hello world")
    resp.set_cookie('username',  'the username')
    return resp
#删除 Cookie
def index():
    resp = make_response("hello world")
#实质上就是将览期时间设置为0
    resp.set_cookie('username', 'the username', expires=0)
    return resp

在网络应用中,通常将 Session 称为“会话控制”。Session 对象存储特定用户所需的属性及配置信息(存储在服务器端)。存储在 Session 对象中的变量不会丢失,而会在整个会话中一直存在下去。Session 是在 Cookie 的基础上实现的,并且对 Cookie 进行密钥签名,这意味着用户可以查看 Cookie 的内容,但不可以修改,除非知道签名的密钥。

Session 的设置与操作,具体代码如下:
from flask import Flask, session, redirect, url_for, request
app = Flask(__name __)
@app.route('/')
def index():
    if 'username'  in session:
        #获取 Session 中的 username
        return T Logged in as %s' % session['username']
    return 'Hi,You are not logged in'
@app.route('/login', methods=['GET' , 'POST'])
def login():
    if request.method == 'POST':
        #将表单中传入的username作为Session中的username传入
        session['username'] = request.form.get('username1)
        return redirect(url_for(1 index 1))
    return '''
        <form action="" method="post">
            <p><input type=text name=username>
            <p><input type=submit value=Login>
        </form>
    '''
@app.route('/logout')
def logout():
    #在 Session 中删除username,实际上就是设置其为空
    session.pop('username', None)
    return redirect(url_for ('index') ) #跳转回 index 页面
app.config['SECRET_KEY']='123456'    #设置密钥
app.run(port=5001, debug=True)

除上述设置密钥的方法外,还可以使用如下方法进行设置,
app.secret_key = 'A0Zr98j/3yX R~XHH! jmN] LWX/,?RT'/example

7) 模板中的判断条件与循环语句

在 Python 中生成 HTML 实际上是一个很烦琐的过程,不过,在 Flask 中配置好了 Jinja2 模板,避免了这一烦琐的过程。模板可以保持应用程序与网页的布局或界面逻辑是分开的,这样会更加容易组织。

第一个模板 index.html,具体代码如下:
<html>
    <head>
        <title>{{title}}</title>
    </head>
    <body>
        <h1>Hi, {{user.name}}!</h1>
    </body>
</html>
可以看到,模板中的标签内容由{{}}代替,这样就可以实现变量的传入。

下面来看看是怎么使用这些模板的,具体代码如下:
from flask import render_template
from app import app
@app.route('/')
@app.route(1/index 1)
def index():
    user = {'name': 'mark'}
    return render_template ("index.html",
        title = 'Home',
        user = user)
render_template( ) 函数的第一个参数指定了网页,后面两个参数指定了模板中需要渲染的变量,这样就实现了一个易分离、易控制的网页。

模板中的判断条件与循环语句使模板变得更加智能,采用 {%...%} 符号将判断条件括起来。

判断条件的使用,具体代码如下:
<html>
    <head>
        {% if title %} #判断title变量是否存在
        <title>{{title}}</title>
        {% else %} #如果不存在
        <title>Hi,</title>
        { % endif %} #结束判断
    </head>
    <body>
        <h1>Hi, {{user.name}}!</h1>
    </body>
</html>

循环语句的使用,具体代码如下:
<html>
    <head>
        <title>learnflask</title>
    </head>
    <body>
        <h1>Hi, {{user.name}}!</h1>
        {% for content in contents %}
        <p>{{content}}</b></p>
        {% endfor %}
    </body>
</html>

使用循环语句与判断条件同理,只需使用 render_template( ) 函数传递对应的参数即可实现。

8) 文件上传

Flask 中的文件上传是利用 request.files 实现的,使用时一定要记得设置 enctype="multipart/form-data" 属性,否则浏览器不会发送文件。

文件上传,具体代码如下:
from flask import request,Flask
app=Flask(__name__)
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['file'] #获取到上传的文件
        #保存到C盘下,并命名为uploaded_file.txt
        f.save('C:\\uploaded_file.txt *)
        return * you have successed in uploading! *
    return '''
        <form action="" method="post” enctype ="multipart/form-data">
            <p><input type=file name=file>
            <p><input type=submit value=上传>
        </form>
app.run (port=10000, debug=True)

相关文章