Flask

Flask

安装flask

使用py3创建虚拟环境,创建后项目目录下会有一个venv目录

mkdir myproject
cd myproject
python3 -m venv venv

激活虚拟环境

. venv/bin/activate

安装Flask

pip install Flask

hello world

先写一个hello world

#导入flask
from flask import Flask
app = Flask(__name__)

#一个route(跟Java的controller相似)
@app.route('/')
def hello_world():
    return 'Hello, World!'

Flask 路由

route()

在flask中路由的绑定使用的是装饰器route()

@app.route('/')
def index():
    return 'Index Page'

@app.route('/login')
def login():
    return 'login'
url变量转换器

flask的路由支持以下方式获取url变量,当不指定其转换器时,默认是str

#匹配url变量,restful风格
@app.route('/user/<username>')
def show_user_profile(username):
	print("username=",username)
	return username

#使用一个int类型的转换器,将url参数转换int
@app.route('/post/<int:post_id>')
def show_post(post_id): 
    return 'Post %d' % post_id

flask支持以下url转换器

string(缺省值) 接受任何不包含斜杠的文本
int接受正整数
float接受正浮点数
path类似 string ,但可以包含斜杠
uuid接受 UUID 字符串
Http请求接收方式

使用methods可以指定允许接收的http的请求方式,默认是get

from flask import request

#使用methods指定接收哪些HTTP请求
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return "接收post请求"
    else:
        return "接收get请求"
url_for

使用url_for()函数可以通过函数名反向获取其绑定的url路径

#以下内容来自官方案例
from flask import Flask, url_for
from markupsafe import escape

app = Flask(__name__)

@app.route('/')
def index():
    return 'index'

@app.route('/login')
def login():
    return 'login'

@app.route('/user/<username>')
def profile(username):
    return '{}\'s profile'.format(escape(username))

with app.test_request_context():
    print(url_for('index'))
    print(url_for('login'))
    print(url_for('login', next='/'))
    print(url_for('profile', username='John Doe'))
    
#结果   
#/
#/login
#/login?next=/
#/user/John%20Doe

模板引擎

render_template

flask自动帮你配置Jinja2模板引擎,可以使你的route映射到前端模板,做到视图绑定的作用。

在下面的例子中,但你请求/hello/Tom时,flask将会把你跳转到hello.html页面中,并将要渲染的信息通过参数传递过去,这样你就可以将传递的信息渲染到hello.html页面上。

render_template自动转义默认开启。因此,如果 name 包含 HTML ,那么会被自动转义。

from flask import render_template

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    #请求将和hello.html视图进行绑定,并可以携带参数
    return render_template('hello.html', name=name)
视图寻找路径

Flask 会在 templates 文件夹内寻找模板,并支持以下两种路径结构:

#更app在同级目录下
/application.py
/templates
    /hello.html
    
#在application目录下面
/application
    /__init__.py
    /templates
        /hello.html

request

在flask中使用request最为请求对象,通过request对象,我们获取用户请求中的参数和数据。

某些对象在 Flask 中是全局对象,但不是通常意义下的全局对象。这些对象实际上是 特定环境下本地对象的代理。

#一个全局的请求代理
from flask import request


@app.route('/login', methods=['POST', 'GET'])
def login():
    error = None
    #请求代理,会根据其线程号去动态获取真实的request
    #所以这里使用全局request将会指向的当前线程的local(本地环境)中的request对象
    if request.method == 'POST':
        if valid_login(request.form['username'],
                       request.form['password']):
            return log_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
    return render_template('login.html', error=error)
文件上传

在flask中,可以直接通过以下方式获得文件

from flask import request
from werkzeug.utils import secure_filename
@app.route('/upload', methods=['POST'])
def upload_file():
	f = request.files['the_file']
        f.save('/var/uploads/uploaded_file.txt')
        #以用户上传的名字设置名字
        #f.save('/var/uploads/' + secure_filename(f.filename))

Cookies

用户请求中的cookies,可以通过request.cookies直接获取

@app.route('/')
def index():
    username = request.cookies.get('username')

而如果你想在响应中设置cookies,可以通过以下方法

from flask import make_response

@app.route('/')
def index():
    resp = make_response(render_template(...))
    resp.set_cookie('username', 'the username')
    return resp

redirect

上面说了我们可以通过render_template()跟一个视图进行绑定,现在就讲一下重定向,在flask中重定向使用redirect函数进行操作,使用十分简单。

from flask import abort, redirect, url_for

@app.route('/')
def index():
    #先通过url_for获取login函数绑定的url路径,再通过redirect重定向到该url上
    return redirect(url_for('login'))

@app.route('/login')
def login():
    abort(401)
    this_is_never_executed()
重定向到flask定制的错误页
from flask import render_template

@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html'), 404

make_response

在flask中使用make_response来定制自己的响应

from flask import render_template, url_for,make_response
@app.errorhandler(404)
def not_found(error):
    resp = make_response(render_template('error.html'), 404)
    #设置响应头
    resp.headers['X-Something'] = 'A value'
    return resp

JSON格式的响应

flask支持将一个python dict转换为json字符串并作为响应返回到前端。

@app.route("/me")
def me_api():
    user = get_current_user()
    return {
        "username": user.username,
        "theme": user.theme,
        "image": url_for("user_image", filename=user.image),
    }

session

flask中session对象来代表会话,当然这个session和request一样也是一个代理对象,实际的session对象会去本地环境中获取。

#下面官方案例
from flask import Flask, session, redirect, url_for, request
app = Flask(__name__)

#对session id进行加盐
app.secret_key = b'_5#y2asdfas4Q8z\n\xec]/'

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('index'))
     return '''
        <form method="post">
            <p><input type=text name=username>
            <p><input type=submit value=Login>
        </form>
    '''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值