推荐系统从入门到实战——Flask框架的使用

本文详细介绍了Flask框架的安装、配置、路由设置、动态URL、视图函数和响应处理,以及重定向和错误处理的基本用法,帮助开发者快速上手轻量级Web开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flask框架的使用

Flask简介

Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。

Flask是目前十分流行的web框架,采用Python编程语言来实现相关功能。Flask框架的主要特征是核心构成比较简单,但具有很强的扩展性和兼容性,程序员可以使用Python语言快速实现一个网站或Web服务。一般情况下,它不会指定数据库和模板引擎等对象,用户可以根据需要自己选择各种数据库。

Flask环境配置

方法:利用virtualenv来构建虚拟的环境

安装virtualenv

pip install virtualenv

创建虚拟环境

mkdir newproj
cd newproj
virtualenv venv

激活环境

venv/bin/activate

安装包

pip install Flask

测试安装

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
   return 'Hello World'

if __name__ == '__main__':
   app.run()

终端执行

python Hello.py

运行上述代码,在浏览器中打开localhost:5000,将显示**“Hello World”**消息。
上述代码中,Flask将(name)作为参数,即Flask在当前模块运行,route()函数是一个装饰器,将请求的url映射到对应的函数上。上述代码将’/'与hello_world()函数进行绑定,因此在请求localhost:5000时,网页显示 Hello World 结果。

程序的启动是用过Flask类的run()方法在本地启动服务器应用程序。

app.run(host, port, debug, options)

 序号   参数与描述  1  host 要监听的主机名。默认为  127.0.0.1  (localhost)。设置为“0.0.0.0"以使服务器在外部可用  2  port 默认值为  5000 3  debug 默认为false。如果设置为true,则提供调试信息  4  options 要转发到底层的Werkzeug服务哭。  \begin{array}{|l|l|} \hline \text { 序号 } & \text { 参数与描述 } \\ \hline 1 & \text { host 要监听的主机名。默认为 } 127.0 .0 .1 \text { (localhost)。设置为“0.0.0.0"以使服务器在外部可用 } \\ \hline 2 & \text { port 默认值为 } 5000 \\ \hline 3 & \text { debug 默认为false。如果设置为true,则提供调试信息 } \\ \hline 4 & \text { options 要转发到底层的Werkzeug服务哭。 } \\ \hline \end{array}  序号 1234 参数与描述  host 要监听的主机名。默认为 127.0.0.1 (localhost)。设置为“0.0.0.0"以使服务器在外部可用  port 默认值为 5000 debug 默认为false。如果设置为true,则提供调试信息  options 要转发到底层的Werkzeug服务哭。 

主要内容

路由

在Flask中,路由是指用户请求的URL与视图函数之间的映射。Flask通过利用路由表将URL映射到对应的视图函数,根据视图函数的执行结果返回给WSGI服务器。路由表的内容是由开发者进行填充,主要有一下两个方式。

route装饰器

使用Flask应用实例的route装饰器将一个URL规则绑定到 一个视图函数上。

@app.route('/test')
def test():
  return 'this is response of test function.'

通过装饰器的方式,Flask框架会将URL规则*/test绑定到视图函数test()*上。

add_url_rule()

该方法直接会在路由表中注册映射关系。其实route装饰器内部也是通过调用*add_url_rule()*方法实现的路由注册。

def test():
  return 'this is response of test function.'
app.add_url_rule('/test',view_func=test)

指定HTTP方法

默认情况下,Flask的路由支持HTTP的GET请求,如果需要视图函数支持HTTP的其他方法,可以通过methods关键字参数进行设置。关键字参数methods的类型为list,可以同时指定多种HTTP方法。

@app.route('/user', methods = ['POST', 'GET'])
def get_users():
  if request.method == 'GET':
    return ... # 返回用户列表
  else:
    return ... # 创建新用户 

匹配动态URL

动态URL用于当需要将同一类*URL映射到同一个视图函数处理,比如,使用同一个视图函数 来显示不同用户的个人信息。那么可以将URL中的可变部分使用一对小括号<>声明为变量, 并为视图函数声明同名的参数:

@app.route('/user/<uname>')
def get_userInfo(uname):
  return '%s\'s Informations' % uname

除了上述方式来设置参数,还可以在URL参数前添加转换器来转换参数类型:

@app.route('/user/<int:uname>')
def get_userInfo(uname):
    return '%s\'s Informations' % uname

使用该方法时,请求的参数必须是属于int类型,否则将会出现404错误。目前支持的参数类型转换器有:

匹配动态URL

为了满足一个视图函数可以解决多个问题,因此每个视图函数可以配置多个路由规则。

@app.route('/user')
@app.route('/user/<uname>')
@app.route('/user/<int:uname>')
def get_userInfo(uname=None):
    if uname:
    	return '%s\'s Informations' % uname
    else:
        return 'this is all informations of users'

URL构建方法

在很多时候,在一个实用的视图中需要指向其他视图的连接,为了防止路径出现问题,我们可以让Flask框架帮我们计算链接URL。简单地给url_for()函数传入一个访问点,它返回将是一个可靠的URL地址:

@app.route('/')
def hello():
    return 'Hello world!'

@app.route('/user/<uname>')
def get_userInfo(uname=None):
    if uname: return '%s\'s Informations' % uname
    else: return 'this is all informations of users'
@app.route('/test')
def test_url_for():
    print(url_for('hello'))  # 输出:/

添加URL变量 : 如果指定访问点对应的视图函数接收参数,那么关键字参数将生成对应的参数URL。下面的 示例将生成 /user/zhangsan:

@app.route('/')
def hello():
    return 'Hello world!'

@app.route('/user/<uname>')
def get_userInfo(uname=None):
    if uname:
        return '%s\'s Informations' % uname
    else:
        return 'this is all informations of users'

@app.route('/test')
def test_url_for():
    print(url_for('get_userInfo', uname='zhangsan'))  # 输出:/user/zhangsan
    print(url_for('test_url_for', num=2))  # 输出:/test?num=2

请求,响应及会话

对于一个完整的HTTP请求,包括了来自客户端的请求对象(Request),服务器端的响应对象(Respose)和会话对象(Session)等。在Flask框架中,当然也具有这些对象,这些对象不仅可以在请求函数中使用,同时也可以在模板中使用。那我们来简单看看这些对象具体怎么使用。

请求对象 request

在Flask包中,可以直接引入request对象,其中包含Form,args ,Cookies ,files 等属性。Form 是一个字典对象,包含表单当中所有参数及其值的键和值对;args 是解析查询字符串的内容,它是问号(?)之后的URL的一部分,当使用get请求时,通过URL传递参数时可以通过args属性获取;Cookies 是用来保存Cookie名称和值的字典对象;files 属性和上传文件有关的数据。我们以一个登陆的例子看看如何搭配使用这些属性

from flask import request, session, make_response

@app.route('/login', methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        if request.form['username'] == 'admin':
            session['username'] = request.form['username']
            response = make_response('Admin login successfully!')
            response.set_cookie('login_time', time.strftime('%Y-%m-%d %H:%M:%S'))
            return 'Admin login successfully!'
        else:
            return 'No such user!'
    elif request.method == 'GET':
        if request.args.get("username") == 'admin':
            session['username'] = request.form['username']
            return 'Admin login successfully!'
        else:
            return 'No such user!'
        
app.secret_key = '123456'

上述代码中,可以根据method属性判断当前请求的类型,通过form属性可以获取表单信息,并通过session来存储用户登陆信息。特别提醒,使用session时一定要设置一个密钥app.secret_key,并且密钥要尽量复杂。

我们可以使用make_response的方法就是用来构建response对象的第二个参数代表响应状态码,缺省就是”200”。response对象的详细使用可参阅Flask的官方API文档。通过创建的response对象可以使用response.set_cookie()函数,来设置Cookie项,之后这个项值会被保存在浏览器中,等下次请求时可以从request对象中获取到cookies对象。

由于现在前后端的交互会采用json的数据格式进行传输,因此让前端请求的数据是json类型的时候,可以使用get_data()方法来获取。

from flask import Flask, jsonify, request
@app.route('/login', methods=["POST"])
def login():
    request_str = request.get_data()
    request_dict = json.loads(request_str)

获取json数据之后,可以使用flask中的jsonify对象来处理json类型数据。

响应对象 response

如果视图函数想向前端返回数据,必须是Response的对象, 主要将返回数据的几种方式:

视图函数 return 多个值
@app.route("/user_one")
def user_one():
    return "userInfo.html", "200 Ok", {"name": "zhangsan"; "age":"20"}

当return多个值的时候,第一个是字符串,也是网页的内容;"200 Ok"表示状态码及解析;{“name”: “zhangsan”; “age”:“20”} 表示请求头。其中前面两个值是必须要的并且顺序不能改变,请求头不是必须要的,这样Flask会自动将返回的值转换成一个相应对象。如果返回一个字符串,则Response将该字符串作为主体,状态码为200,然后返回该Response对象。

使用Response创建

可以通过直接创建Response对象,配置其参数.

from flask import Response

@app.route("/user_one")
def user_one():
    response = Response("user_one")
    response.status_code = 200
    response.status = "200 ok"
    response.data = {"name": "zhangsan"; "age":"20"}
    return response

使用make_response函数

make_response 函数可以传递三个参数 第一个是一个字符串,第二个传状态码,第三个传请求头。

@app.route("/user_one")
def user_one():
    response = make_response('user_one', 200, {"name": "zhangsan"; "age":"20"})
    return response

由于现在前后端交互往往采用的是json的数据格式,因此可以将数据通过 jsonify 函数将其转化成json格式,再通过response对象发送给前端。

@app.route('/hot_list', methods=["GET"])
def hot_list():
    if request.method == "GET":
        user_id = request.args.get('user_id')
        page_id = request.args.get('page_id')
        if user_id is None or page_id is None:
            return make_response(jsonify({"code": 2000, "msg": "user_id or page_id is none!"}), 200)

重定向与错误处理

重定向

当一个请求过来后可能还需要在请求另一个视图函数才能达到目的,那么就可以调用redirect(location, code=302, Response=None)函数指定重定向页面。

from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route("/demo")
def demo():
    url = url_for("demo2")  # 路由反转,根据视图函数名获取路由地址
    return redirect(url)

@app.route("/demo2")
def demo2():
    return "this is demo2 page"

@app.route("/")
def index():
    # 使用方法:redirect(location, code=302, Response=None) 
    return redirect("/demo", 301) 

错误处理

当请求或服务器出现错误的时候,我们希望遇到特定错误代码时重写错误页面,可以使用 errorhandler() 装饰器:

from flask import render_template

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

当遇到404错误时,会调用page_not_found()函数,返回元组数据,第一个元素是”page_not_found.html”的模板页,第二个元素代表错误代码,返回值会自动转成 response 对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小陈phd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值