python的简单web框架flask【附例子】

前言

今天好奇,去了解了一下python的web框架。感觉flask对于新手真的很友好

概要

以下是一些常见的 Python Web 框架

  1. Django:Django 是一个全功能的 Web 框架,提供了包括路由、模型-视图-模板(MVT)模式、表单处理、管理后台等在内的一系列功能。它的设计目标是帮助开发者快速构建复杂的 Web 应用程序,并提供了强大的自动化功能和内置的安全机制。

  2. Flask:我们之前讨论过的 Flask 是一个轻量级的 Web 框架,它的设计理念是保持简洁和灵活。相比于 Django,Flask 更适合用于构建小型和中型的 Web 应用程序,同时也更容易学习和上手

  3. FastAPI:FastAPI 是一个新兴的 Web 框架,它基于 Python 3.6+ 的新特性,使用类型注解和异步编程的方式来提供高性能的 API。FastAPI 非常适合构建高性能的 API 服务,并提供了自动生成文档、输入参数验证等功能。

  4. Tornado:Tornado 是一个异步的 Web 框架,其设计目标是支持高并发和大量连接的场景。Tornado 的异步特性使得它非常适合用于构建实时性要求高的应用,例如聊天应用、实时通讯等。

使用Flask

创建了一个基本的 Flask 网页应用

第一步:安装Flask

pip install flask

第二步:使用

from flask import Flask

# flask 应用对象 app 用于处理网页请求和响应
app = Flask(__name__)

# 不写methods  默认的请求方法就是 GET
@app.route('/', methods=['GET', 'POST'])
def get_hello():
    return 'hello'


if __name__ == '__main__':
    app.run(debug=True, port=8085)

效果

游览器发送get请求:
在这里插入图片描述
postman测试post get请求
在这里插入图片描述

可能第一次接触看不懂,我简单解释一下代码:

  1. from flask import Flask: 这行代码导入了Flask类,这是Flask框架的核心部分。它允许你创建一个Flask应用

  2. app = Flask(__name__): 这行代码创建了一个Flask应用实例。__name__参数是Python中的特殊变量,用来指示当前模块的名称。在这里,__name__将会是__main__,因为这段代码是直接执行的,而不是被导入到其他模块中。

  3. @app.route('/'): 这是一个装饰器,用来将URL路径’/'与下面定义的get_hello()函数关联起来。意味着当访问根路径时,将会调用get_hello()函数。

  4. def get_hello(): 这是一个定义的函数,用于处理根路径的请求。返回了一个字符串"hello"作为响应内容。

  5. if __name__ == '__main__':: 这是Python中一个常见的惯用法。这行代码的作用是检查当前模块是否是被直接执行的主程序。当Python解释器读取一个Python文件时,它会将其中的全局变量__name__设置为__main__。因此,通过检查__name__是否等于__main__,可以确定当前模块是否是主程序。

  6. app.run(debug=True, port=8085): 这行代码启动了Flask应用。debug=True参数表示启用调试模式,这在开发过程中很有用。port=8085指定了应用监听的端口号(默认端口5000)

动态路由

动态路由是 Flask 中一个非常重要的概念,它允许你在 URL 中使用变量,以便根据不同的请求动态生成响应。这使得你可以创建更加灵活和动态的路由规则,从而构建更加强大和可扩展的 Web 应用。

案例一

from flask import Flask

app = Flask(__name__)


@app.route('/test/<user>')
def fun(user):
    return f'Hi {user}'


if __name__ == '__main__':
    app.run(port=8085, debug=True)

效果:
在这里插入图片描述

案例二
Flask 自带了几种常用的转换器:

  • string:接受任何不包含斜杠的文本,默认转换器,即如果不指定转换器,参数默认为 string 类型。
  • int:接受正整数。
  • float:接受正浮点数。
  • path:接受包含斜杠的文本,通常用于匹配文件路径。
from flask import Flask

app = Flask(__name__)


# 使用 string 转换器
@app.route("/user/<string:username>")
def user_profile(username):
    return f'User profile: {username}'


# 使用 int 转换器
@app.route("/post/<int:post_id>")
def show_post(post_id):
    return f'Showing post: {post_id}'


# 使用 float 转换器
@app.route("/price/<float:price>")
def show_price(price):
    return f'Price: ${price}'


# 使用 path 转换器
@app.route("/path/<path:path>")
def show_path(path):
    return f'Path: {path}'


if __name__ == '__main__':
    app.run(port=8085, debug=True)


案例三
自定义转换器是 Flask 中一个非常强大的功能,它允许你定义自己的 URL 转换规则,以满足特定的需求。案例三定义了一个名为 DateConverter 的自定义转换器,用于处理日期参数。

  1. 自定义转换器类(IntTenConverter):这个类继承自 BaseConverter,它定义了两个方法 to_python 和 to_url,分别用于将 URL 中的值转换为 Python 对象和将 Python 对象转换为 URL 中的值。

  2. to_python 方法:这个方法是用于将 URL 中的值转换为 Python 对象的,to_python 方法将接收到的日期字符串转换为 datetime 对象,使用了 datetime.strptime() 方法,参数 %Y-%m-%d 表示接受的日期格式为 年-月-日

  3. to_url 方法:这个方法是用于将 Python 对象转换为 URL 中的值的,to_url 方法将 datetime 对象转换为指定格式的日期字符串,使用了 strftime() 方法,同样指定了日期格式为 %Y-%m-%d

  4. 注册自定义转换器:在 Flask 应用中,使用 app.url_map.converters 字典将自定义转换器注册到应用中,这样你就可以在路由规则中使用自定义转换器了。

  5. 在路由中使用自定义转换器:使用了 <date:val_date> 的形式来指定日期参数,并指定了使用定义的自定义转换器。这样,Flask 将自动将 URL 中匹配的部分转换为 datetime 对象,并传递给相应的视图函数。

from flask import Flask
from werkzeug.routing import BaseConverter
from datetime import datetime

app = Flask(__name__)


# 自定义日期转换器,用于接受指定格式的日期字符串并转换为 datetime 对象
class DateConverter(BaseConverter):
    def to_python(self, value):
        # 将接收到的日期字符串转换为 datetime 对象
        return datetime.strptime(value, '%Y-%m-%d')

    def to_url(self, value):
        # 将 datetime 对象转换为指定格式的日期字符串
        return value.strftime('%Y-%m-%d')


# 将自定义转换器注册到 Flask 应用中
app.url_map.converters['date'] = DateConverter


# 定义路由规则,其中 <date:val_date> 使用了自定义转换器
@app.route('/test/<date:val_date>')
def events_by_date(val_date):
    # 在视图函数中使用日期参数
    return f'time {val_date}'


if __name__ == '__main__':
    app.run(port=8085, debug=True)

在这里插入图片描述

发送请求 处理请求

from flask import Flask, jsonify, request
import requests

app = Flask(__name__)


@app.route('/talk')
def get_data():
    url = 'http://121.151.159.11:8011/api/talk'
    response = requests.get(url)

    if response.status_code == 200:
        data = response.json().get('data')
        # 返回json数据
        return jsonify({'data': data})
    else:
        return jsonify({'error': 'Failed to fetch data'})


@app.route('/person')
def person():
    name = request.args.get('name')
    age = request.args.get('age')

    return f'Hello {name}, you are {age} years old'


if __name__ == '__main__':
    app.run(debug=True, port=8085)


效果
在这里插入图片描述

在这里插入图片描述

flask的小demo

目录结构

flask_demo/
│
├── app/
│   ├── __init__.py
│   ├── routes.py
│   ├── models.py
│   ├── forms.py
│   └── templates/
│       └── users.html
│       └── user_form.html
│   └── static/
│       └── users.css
│       └── user_form.css
│
├── run.py

源码地址:https://github.com/yikousu/flask-demo

效果

在这里插入图片描述
在这里插入图片描述

补充知识点

装饰器是Python中一种特殊的语法,它允许在不修改原始函数或类定义的情况下,向它们添加额外的功能或行为。装饰器本质上是一个函数,它接受一个函数或类作为参数,并返回一个新的函数或类。【类似于动态代理】

在Python中,使用@符号可以应用一个装饰器。当装饰器被应用到一个函数或方法上时,它会将该函数或方法作为参数传递给装饰器函数,并将其替换为装饰器函数返回的新函数。这使得我们可以在不改变原始函数的情况下,增强或修改其行为。

装饰器在Python中被广泛用于各种场景,包括但不限于:

  1. 添加日志记录功能。
  2. 进行性能分析。
  3. 实现权限控制。
  4. 缓存函数的结果以提高性能。
  5. 路由映射(如在Flask中的@app.route())。
  6. 错误处理。

通过使用装饰器,可以使代码更加模块化、可维护,并且可以方便地重用功能。

注意

查看电脑python版本

win+r输入cmd
在这里插入图片描述

编码错误

程序运行报错

SyntaxError: Non-UTF-8 code starting with '\xbf' in file C:\code\flask.py on line 1, but no encoding declared; see https://python.org/dev/peps/pep-0263/ for details

这个错误表明 Python 解释器在尝试解析你的代码时遇到了非 UTF-8 编码的字符。Python 3 默认要求源文件使用 UTF-8 编码,因此当文件中包含非 UTF-8 编码的字符时,解释器会抛出这样的错误。

原因:因为我使用了中文注释,如果不适用中文注释就没事

解决方案:首行加:# -*- coding: utf-8 -*-

pip install flask-sqlalchemy出错

错误原因在这里插入图片描述
解决办法:更换镜像源
pip install flask-sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple/
-i(–index-url) 选项告诉 pip 命令去特定的包索引(也就是一个特定的 URL)查找和下载包,而不是使用默认的 PyPI 包索引 (https://pypi.org/simple)。【加-i 临时性换源】
在这里插入图片描述

在这里插入图片描述

启动项目错误

在这里插入图片描述
解决办法
检查 Flask 应用依赖: 确保你的 Flask 应用不会意外依赖了 watchdog 库。如果没有必要,可以尝试删除这个依赖

在这里插入图片描述


❤觉得有用的可以留个关注❤

  • 39
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flask 中,你可以使用模板引擎来将数据传递给前端。常用的模板引擎有 Jinja2 和 Mako。本文以 Jinja2 为例进行说明。 首先,在 Flask 中,你需要在路由函数中获取要传递给前端的数据,然后将这些数据传递给模板引擎。比如: ```python from flask import Flask, render_template app = Flask(__name__) @app.route('/') def index(): data = {'name': 'Tom', 'age': 18} return render_template('index.html', data=data) ``` 在上面的代码中,我们定义了一个路由函数 `/`,它返回一个 HTML 模板 `index.html`,并将一个字典类型的数据 `data` 传递给模板引擎。 接下来,在 `index.html` 模板中,你可以使用模板引擎的语法来获取传递过来的数据,并将它们显示在页面上。比如: ```html <html> <head> <title>Flask Example</title> </head> <body> <p>Name: {{ data.name }}</p> <p>Age: {{ data.age }}</p> </body> </html> ``` 在上面的代码中,我们使用了模板引擎的语法 `{{ data.name }}` 和 `{{ data.age }}` 来获取传递过来的数据,并将它们显示在页面上。 最后,在浏览器中访问 `/` 路由,你就可以看到传递过来的数据在页面上的显示了。 当然,以上只是一个简单例子,实际情况下,你可能需要传递更为复杂的数据结构,比如列表、字典、对象等。针对不同的数据类型,你需要使用不同的模板引擎语法来进行处理。但总的来说,使用 Flask 传递数据给前端还是比较简单的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值