flask简单路由(视图函数)

简单路由(视图函数)

简单返回html

@app.route('/tmp')
def tmp_page():  # 函数名为tmp_page,对应url_for('tmp_page')
    return render_template('tmp.html')

@app.route('/Custom_routing')
def Custom_routing_page():  
    return render_template('/Custom_routing/index.html')
# Custom_routing

post请求路由(接受前端数据类型)

@app.route('/route_message_parameter/message_form', methods=['POST'])
def route_message_parameter_message_form():
    # 处理POST请求
    try:
        name = request.form.get('name')
        location = request.form.get('location')
        age = request.form.get('age')
        if not name or not location or not age:
            return "请填写所有字段", 400
        return f'你好, {name},你来自{location},你今年{age}岁。'
    except Exception as e:
        return f'发生错误: {str(e)}', 400

自定义路由

采用继承的方法

class DateConverter(BaseConverter):
    def to_python(self, value):
        return datetime.strptime(value, '%Y-%m-%d')
    def to_url(self, value):
        return value.strftime('%Y-%m-%d')
# 注册自定义转换器,现在转换器名字叫date
app.url_map.converters['date'] = DateConverter
@app.route('/Custom_route/date_event/<date:custom_date>')
def show_date_event(custom_date):
    # 现在custom_date是一个datetime对象
    print(custom_date)
    return f'今天是{custom_date.strftime("%Y-%m-%d")},欢迎来到自定义路由!'

在路由内部也能预设一些参数

@app.route('/generate_url')
def generate_url():
    specific_date = datetime(2024, 6, 15)
    return url_for('show_date_event', custom_date=specific_date)

路由内部也可以用regex正则表达式

# regex正则表达式路由
class RegexConverter(BaseConverter):
    def __init__(self,url_map,regex):
        # 重写父类方法
        super(RegexConverter,self).__init__(url_map)
        # 原始的 BaseConverter 没有存储正则表达式的机制,我们需要自己保存:(说以有这一步)
        self.regex = regex  #保存正则表达式
    def to_python(self,value):
        print('你好,这里调用了to_python'+value)
        return value
app.url_map.converters['my_cv_regex'] = RegexConverter
@app.route("/user/<my_cv_regex(r'1[3456789]\d{9}'):user_id>")
def get_user(user_id):
    if not re.match(r'1[3456789]\d{9}', user_id):
        return None #其实这边return不会执行到
    return f"格式正确,用户ID: {user_id}"

异常捕获

一般我们用abort()抛出异常

@app.route("/user/<my_cv_regex(r'1[3456789]\d{9}'):user_id>")
def get_user(user_id):
    if not re.match(r'1[3456789]\d{9}', user_id):
        abort(404)  # 如果不匹配,返回404错误
        return None #其实这边return不会执行到
    # try-except捕获异常
    try:
        if re.match(r'1[3456789]\d{9}', user_id):
            print(f"格式正确,用户ID: {user_id}")
            return render_template('Custom_routing/user.html', user_id=user_id)
        # 我这边没有建立user.html模板,所以会报错让except捕获400,我没处理是为了和404对比
    except Exception as e:
        return f"发生错误: {str(e)}", 400

你可以使用errorhandler自定义处理异常,你可以抛出一个页面也可以直接return你要表达的语句

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

如果说程序异常崩溃,类似于无法找到渲染页面

我们就用try-except捕获异常处理

前端js如何联系app.py

下面是一个简单的前端逻辑处理

他的功能很简单:对post传递name,location,age以及判断用户输入

      try {
                // 发送数据到服务器
                const response = await fetch('/route_message_parameter/message_form', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded',
                    },
                    body: new URLSearchParams({
                        'name': name,
                        'location': location,
                        'age': age
                    })
                });
                
                if (response.ok) {
                    const message = await response.text();
                    document.getElementById('messageText').textContent = message;
                    document.getElementById('result').style.display = 'block';
                } else {
                    throw new Error('服务器返回错误');
                }
            } catch (error) {
                alert('提交失败,请稍后重试: ' + error.message);
            }
        });
posted @ 2025-09-17 19:42  guixiang  阅读(10)  评论(0)    收藏  举报