Flask核心技能:从零上手视图函数

🤔 视图函数是什么?

简单说,视图函数就是你为某个特定的URL(路由)编写的处理函数。当用户访问这个URL时,Flask就会调用这个函数,并将函数的返回值作为响应发送给用户的浏览器。

 

它是连接请求(Request)和响应(Response)的核心桥梁,是你实现业务逻辑的主要舞台。

 

✏️ 如何定义一个视图函数?

定义视图函数只需两步:1. 使用 @app.route 装饰器绑定URL;2. 编写一个Python函数。

 

from flask import Flask

app = Flask(__name__)

 

# 1. 绑定路由 ‘/‘

@app.route('/')

def index():

    # 2. 编写处理逻辑

    return '欢迎来到首页!'

 

# 带变量的路由

@app.route('/user/')

def show_user_profile(username): # 变量名必须与路由中一致

    return f'用户:{username}'

装饰器是关键,它告诉Flask哪个URL触发哪个函数。

 

📥 如何处理请求数据?(GET/POST)

Web应用的核心是与用户输入互动。Flask的 request 对象封装了所有请求数据。

 

from flask import request

 

# 处理GET请求的查询参数:/search?q=keyword

@app.route('/search')

def search():

    keyword = request.args.get('q', '') # 安全获取参数,避免KeyError

    return f'搜索关键词:{keyword}'

 

# 处理POST请求的表单数据(如登录)

@app.route('/login', methods=['POST']) # 必须指明methods

def login():

    username = request.form.get('username')

    password = request.form.get('password')

    # ... 验证逻辑 ...

    return f'用户 {username} 尝试登录'

 

# 处理JSON格式的请求体(常见于API)

@app.route('/api/data', methods=['POST'])

def receive_data():

    json_data = request.get_json() # 直接解析为字典/列表

    return {'received': json_data}, 200

记住:request.args 用于GET查询参数,request.form 用于POST表单数据,request.get_json() 用于JSON数据。

 

📤 如何返回多样化的响应?

视图函数可以返回多种类型的响应,不仅仅是字符串。

 

from flask import render_template, jsonify, redirect, url_for, make_response

 

# 1. 返回字符串(默认)

@app.route('/hello')

def hello():

    return 'Hello, World!'

 

# 2. 返回JSON(构建API必备)

@app.route('/user/')

def get_user(user_id):

    user_data = {'id': user_id, 'name': '张三'}

    return jsonify(user_data) # 自动设置Content-Type为application/json

 

# 3. 返回HTML模板

@app.route('/home')

def home():

    return render_template('home.html', title='主页')

 

# 4. 重定向

@app.route('/old')

def old_endpoint():

    return redirect(url_for('home')) # 重定向到‘home’函数对应的URL

 

# 5. 自定义响应对象(设置Header、Cookie等)

@app.route('/custom')

def custom_response():

    resp = make_response(render_template('index.html'))

    resp.set_cookie('token', 'abc123')

    resp.headers['X-Custom-Header'] = 'Value'

    return resp

使用 jsonify() 返回JSON,render_template() 返回渲染的HTML,redirect() 进行页面跳转,这是最常用的三种方式。

 

⚠️ 如何进行错误处理?

优雅地处理错误能极大提升用户体验。Flask允许你为特定错误码定制页面或响应。

 

from flask import render_template

 

# 1. 使用装饰器注册错误处理器

@app.errorhandler(404)

def page_not_found(error):

    # 可以返回模板,也可以返回JSON(针对API)

    return render_template('404.html'), 404 # 必须返回错误码

 

@app.errorhandler(500)

def internal_server_error(error):

    return '服务器内部错误,请稍后再试!', 500

 

# 2. 在视图函数中手动触发错误

@app.route('/admin')

def admin():

    # 假设用户未登录,则返回403禁止访问

    # 可以使用 abort() 函数立即中断并返回错误响应

    from flask import abort

    abort(403)

@app.errorhandler 是自定义错误页面的标准方法,别忘了在返回值里指明状态码。

 

🔢 如何理解和使用状态码?

HTTP状态码是服务器对请求的“回应语”。在Flask中,你可以轻松设置它。

 

常见状态码:

 

- 200 OK:请求成功(Flask返回字符串或模板时默认)

- 301/302:重定向(`redirect()` 默认返回302)

- 400 Bad Request:客户端请求错误

- 404 Not Found:资源不存在

- 500 Internal Server Error:服务器内部错误

设置方法很简单,在返回值后加上数字即可:

 

@app.route('/created')

def created():

    # 创建成功,返回201 Created状态码

    return '资源已创建', 201

 

@app.route('/no_content')

def no_content():

    # 处理成功,但无内容返回,返回204 No Content

    return '', 204

🧪 完整代码示例

将以上知识点融合,下面是一个功能较全的Flask应用示例:

 

from flask import Flask, request, jsonify, render_template_string, abort

 

app = Flask(__name__)

 

# 首页,返回字符串

@app.route('/')

def index():

    return '欢迎!试试访问 /hello?name=你的名字 或向 /submit 发送POST请求。'

 

# 处理GET请求和查询参数

@app.route('/hello')

def hello():

    name = request.args.get('name', '陌生人')

    return f'你好,{name}!'

 

# 处理POST请求和表单数据

@app.route('/submit', methods=['POST'])

def submit():

    data = request.form.get('data')

    if not data:

        return '未接收到数据', 400 # 客户端错误

    return jsonify({'status': 'success', 'received_data': data})

 

# 带变量路由和模拟API

@app.route('/api/users/')

def get_user_api(user_id):

    if user_id > 100:

        abort(404, description="用户不存在") # 触发404错误

    return jsonify({'user_id': user_id, 'name': '测试用户'})

 

# 自定义404错误处理

@app.errorhandler(404)

def not_found(error):

    # 返回一个简单的HTML错误页面

    html_template = '''

    <h1>页面走丢啦!</h1>

    <p>{{ error_description }}</p>

    '''

    return render_template_string(html_template, error_description=error.description), 404

 

if __name__ == '__main__':

    app.run(debug=True)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值