基于《Python Web开发项目教程 [Flask版]》输出的app.py [带注释,持续更新]

news2024/10/23 22:41:07


由于项目需要做可视化,前端及框架技术薄弱,只能选择读书

书籍名称为:《Python Web开发项目教程 [Flask版]》-- 黑马程序员 著(自费,35.00,JD购得)

将书中示例代码,加上注释,统一放在:app.py 中,供大家学习使用,会持续更新,放心~

更新日期:2024.10.23

#!/usr/bin/python
# -*- coding:utf-8 -*-

from flask import Flask

app = Flask(__name__)
# 通过访问字典元素的方式使用配置信息
# app.config['TESTING'] = True
# app.config['DEBUG'] = True
# 调用 flask.Config 从父类继承的 update() 方法
# app.config.update(
#     TESTING=True,
#     SECRET_KEY=b'_5#y2L"F4Q8z\n\xec]/'
# )
# 通过导入文件的方式使用配置信息
import json
app.config.from_file('config.json', load=json.load)
# 通过 from_pyfile() 方法从 py 文件中导入配置项
# app.config.from_pyfile('config.py')
"""
# 通过 from_object() 方法从 Python 类中导入配置项
class Settings:
    TESTING = True
    SECRET_KEY=b'_5#y2L"F4Q8z\n\xec]/'
setting = Settings()
app.config.from_object(setting)
"""

@app.route('/')
def hello_flask():
    return "<p>Hello, Flask!</p>"

# 通过 route 来注册路由
@app.route('/index')
@app.route('/homepage')
def index():
    return f'<h1>This is index page!</h1>'

# 通过 add_url_rule 来注册路由
def index_new():
    return f'<h1>This is index new page!</h1>'
app.add_url_rule(rule='/index_new', view_func=index_new)

# 通过 URL 传递参数给视图函数
# 显示指定类型转换器,内置转换器 int
@app.route('/<int:page>')
def page_num(page):
    return f'Current Page Number: {page}'

# 自定义转换器,继承 BaseConverter 类,语法:程序实例.url_map.converters['自定义转换器名称']=自定义转换器的类名
from werkzeug.routing import BaseConverter
class MobileConverter(BaseConverter):
    regex = '1[3-9]\d{9}$'
app.url_map.converters['mobile']=MobileConverter
@app.route('/user/<mobile:mobile>')
def index_mobile(mobile):
    return f'Mobile Number is {mobile}'

# UUID, Universally Unique Identifier
# 通用唯一识别码,由 32 位十六进制数字构成,以连接符-分隔为 5 组来显示,形式为:8-4-4-4-12

# 在路由注册时显示指定请求方式为 GET,请求方式为列表形式,可以包含一个或多个方式
# @app.route('/login', methods=['GET', 'POST'])
# Flask2.0 之后的快捷简写方式
# @app.get('/login')
# def login():
#     return f'<h1>Login success</h1>'

from flask import after_this_request

# before_first_request 在 Flask2.3 中就已经废弃了,当前使用版本为 3.0,故无法使用该方法
# @app.before_first_request
# def before_first_request():
#     print("这是请求钩子 before_first_request 注册的函数")

@app.before_request
def before_request():
    print("这是请求钩子 before_request 注册的函数")
@app.route('/index_request')
def index_request():
    print('Hello Flask')
    @after_this_request
    def after_this_request_func(response):
        print("这是请求钩子 after_this_request_func 注册的函数")
        return response
    return 'Hello Flask'
@app.after_request
def after_request(response):
    print("这是请求钩子 after_request 注册的函数")
    return response
@app.teardown_request
def teardown_request(error):
    print("这是请求钩子 teardown_request 注册的函数")

# update 2024.10.21
from flask import request
# @app.route('/index')
# def index():
#     user_agent = request.user_agent    # 获取浏览器标识信息
#     return f'{user_agent}'

from flask import session
app.secret_key = 'Your_secret_key&^52@!'    # 设置 secret_key 的值
@app.route('/index')
def index():
    if 'username' in session:
        return f'Hello: {session.get("username")}'
    return 'Please login in'
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        session['username'] = request.form['username']    # 设置 session 的值
        return 'Login success'
    return '''
        <form method="post">
            <p><input type=text name=username>
            <p><input type=submit value='Login'>
        </form>
    '''
# update 2024.10.23
# 使用 current_app 对象获取当前程序中的密钥
from flask import current_app
@app.route('/index_current_app')
def index():
    return f'{current_app.secret_key}'
# 使用 g 对象模拟获取当前用户信息
from flask import g
@app.route('/index_g')
def get_user():
    user_id = '001'             # 设置用户 ID
    user_name = 'flask'         # 设置用户名称
    g.user_id = user_id         # 将用户 ID 保存到 g 对象中
    g.user_name = user_name     # 将用户名称保存到 g 对象中
    result = db_query()
    return f'{result}'
def db_query():
    user_id = g.user_id         # 使用 g 对象获取用户 ID
    user_name = g.user_name     # 使用 g 对象获取用户名称
    return f'{user_id}:{user_name}'

from flask import Response
@app.route('/index_response')
def index_resonse():
    # 使用 Response 类的构造方法生成响应,设置响应状态码为 201,响应类型为 text/html
    resp = Response(
        response='Python&Flask',
        status=201,
        content_type='text/html;charset=utf-8'
    )
    return resp
from flask import make_response
@app.route('/index_make_res')
def index_make_res():
    # 传入一个元组依次设置响应体、响应状态码、响应类型、响应长度(实测未生效)
    res = make_response(
        'Python&Flask',
        201,
        {'content-type':'text/html;charset=utf-8', 'content-length': 15}
    )
    return res

from flask import jsonify
@app.route('/index_resp_json')
def index_resp_json():
    res = make_response(jsonify({'Python':'Flask'}), 202)
    return res

from flask import url_for
@app.route('/hello/flask')
def greet():
    # 反向解析视图函数 greet() 对应的 URL
    return f'{url_for("greet")}'
@app.route('/hello/<name>')     # 指定的 URL 归则中包含变量 name
def greet_name(name):           # 将 name 传递给视图函数 greet_name()
    # return f"{url_for('greet_name', name=name)}"    # 在函数内部反向解析时将 name 以关键字参数形式传递
    # return f"{url_for('greet_name', name=name, age=20)}"    # 传入了 URL 传递的参数 name,同时还以关键字参数形式传入 age=20
    return f"{url_for('greet_name', name=name, addr='北京')}"    # url_for() 函数可以对 URL 地址中的一些特殊字符自动编码
    # return: /hello/zhangsan?addr=%E5%8C%97%E4%BA%AC

from flask import redirect
@app.route('/index_redirect')
def index_redirect():
    if 'username' in session:
        return f'Hello: {session.get("username")}'
    return redirect(url_for('index_login'))
@app.route('/index_login', methods=['GET', 'POST'])
def index_login():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('index_redirect'))
    return '''
        <form method="post">
            <p><input type=text name=username>
            <p><input type=submit value='Login'>
        </form>
    '''


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2221925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络运输层之(1)TCP连接管理

网络运输层之(1)TCP连接管理 Author: Once Day Date: 2024年10月22日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客…

【四】企业级JavaScript开发开发者控制台

多行输入 通常&#xff0c;当我们向控制台输入一行代码后&#xff0c;按 Enter&#xff0c;这行代码就会立即执行。 如果想要插入多行代码&#xff0c;请按 ShiftEnter 来进行换行。这样就可以输入长片段的 JavaScript 代码了。 总结 开发者工具允许我们查看错误、执行命令、…

【python爬虫课程设计】天气预报——分类数据爬取+数据可视化

一、选题的背景 随着人们对天气的关注逐渐增加&#xff0c;天气预报数据的获取与可视化成为了当今的热门话题&#xff0c;天气预报我们每天都会关注&#xff0c;天气情况会影响到我们日常的增减衣物、出行安排等。每天的气温、相对湿度、降水量以及风向风速是关注的焦点。通过…

【Linux】线程互斥与同步,生产消费模型(超详解)

目录 线程互斥 进程线程间的互斥相关背景概念 数据不一致问题 锁 深度理解锁 原理角度理解&#xff1a; 实现角度理解&#xff1a; 线程同步 条件变量 测试代码 生产消费模型 生产消费模型概念 编写生产消费模型 BlockingQueue &#xff08;1&#xff09;创建生产…

Dell服务器导入idrac 授权文件 (适用iDRAC7、iDRAC8、iDRAC9)

iDRAC Enterprise、iDRAC Datacenter 和 CMC Enterprise 的 30 天试用许可证,供熟悉高级功能集,例如使用虚拟控制台等 OpenManage Enterprise Advanced 或 Advanced+ 许可证支持高级功能,例如自动部署、服务器配置合规性和激活可用插件,如 OpenManage Enterprise Power Ma…

MySQL 数据库迁移至达梦 DM8 常见问题

目录 如何让迁移到 DM 的表名大小写和 MySQL 保持一致 MySQL 迁移到 DM 报错&#xff1a;列[NAMES]长度超出定义 MySQL 迁移到 DM 报错&#xff1a;记录超长 索引错误 DM大小写敏感配置 表空间 新建用户 用户与模式的关系 省略模式名的优势 实际操作 如何让迁移到 DM…

知识图谱的概念、特点及应用领域(详解)

目录 什么是知识图谱&#xff1f; 二、特点 三、应用领域 什么是知识图谱&#xff1f; 知识图谱&#xff08;Knowledge Graph&#xff09;是一种将知识进行结构化、组织和表示的方法&#xff0c;它利用图形模型表示事物之间的关系和属性。知识图谱通过节点&#xff08;实体&…

qt QWidget详解

一、概述 QWidget是容器组件&#xff0c;继承自QObject类和QPaintDevice类。能够绘制自己和处理用户输入&#xff0c;是QT中所有窗口组件类的父类&#xff0c;是所有窗口组件的抽象&#xff0c;每个窗口组件都是一个QWidget&#xff0c;QWidget类对象常用作父组件或顶级组件使…

T113 内核中 adbd相关配置1

准备工作 1. 配置 系统&#xff1a;ubuntu24.04docker&#xff08;ubuntu18.04&#xff09; 软件vscode, sdk:Tina-linux&#xff08;BingPi-M2&#xff09; 2. 构建环境直接使用自带的 source ./build/envsetup.sh lunch 选择 6 编译开启16线程 make -j16boot编译 mboot 打包…

关于jmeter中没有jp@gc - response times over time

1、问题如下&#xff1a; jmeter没有我们要使用的插件 2、解决方法&#xff1a; 选择下面文件&#xff0c;点击应用&#xff1b; 3、问题解决 ps&#xff1a;谢谢观看&#xff01;&#xff01;&#xff01;

力扣 简单 746.使用最小花费爬楼梯

文章目录 题目介绍题解 题目介绍 题解 思路分析&#xff1a; 确定dp数组以及下标的含义&#xff1a;dp[i]的定义为到达第i台阶所花费的最少体力。确定递推公式&#xff1a;可以有两个途径得到dp[i]&#xff0c;一个是dp[i-1] 一个是dp[i-2]。dp[i - 1] 跳到 dp[i] 需要花费 d…

玩转springboot之springboot异步执行

springboot异步执行 使用EnableAsync开启异步执行 在接口方法上使用Async注解进行标注&#xff0c;该接口是一个异步接口 自定义异步线程执行器 Configuration public class CustomAsyncConfigurer implements AsyncConfigurer {Overridepublic Executor getAsyncExecutor() {T…

WebGL编程指南 - 颜色与纹理

将顶点的其他&#xff08;非坐标&#xff09;数据——如颜色等——传入顶点着色器。 发生在顶点着色器和片元着色器之间的从图形到片元的转化&#xff0c;又称为图元光栅化 &#xff08;rasterzation process&#xff09;。 将图像&#xff08;或称纹理&#xff09;映射到图形…

C++笔记---哈希表

1. 哈希的概念 哈希(hash)又称散列&#xff0c;是一种组织数据的方式。从译名来看&#xff0c;有散乱排列的意思。 本质就是通过哈希函数把关键字Key跟存储位置建立一个映射关系&#xff0c;查找时通过这个哈希函数计算出Key存储的位置&#xff0c;进行快速查找。 STL中的un…

推荐IDE中实用AI编程插件,目前无限次使用

插件介绍 一款字节跳动推出的“基于豆包大模型的智能开发工具” 以vscode介绍【pycharm等都可以啊】&#xff0c;这个插件提供智能补全、智能预测、智能问答等能力&#xff0c;节省开发时间 直接在IDE中使用&#xff0c;就不用在网页中来回切换了 感觉还可以&#xff0c;响应速…

Excel表格如何修改“打开密码”,简单几步,轻松搞定

在保护Excel文件的安全性时&#xff0c;设置打开密码是常见且有效的方式。然而&#xff0c;有时我们需要修改已经设置的打开密码&#xff0c;以确保文件安全性或更新密码信息。今天小编来分享一下修改Excel文件打开密码的方法&#xff0c;操作简单&#xff0c;一起来看看吧&…

设置OpenAI API的环境变量

获取openai API 密钥 https://platform.openai.com/api-keys 设置环境变量 为什么不在代码中直接写入&#xff0c;而是设置环境变量&#xff1f; 安全性&#xff1a;将 API 密钥存储在环境变量中&#xff0c;而不是直接写在代码中&#xff0c;可以降低泄露密钥的风险。易于…

第二期:第15节,beep 大海

首先是 代码的编写&#xff1a; 里面已经有了解释了。 1 /*2 * main.c3 *4 * Created on: 2023-3-85 * Author: pengdan6 */7 #include "exynos_4412.h"89 void delay_ms(unsigned int num)10 {11 int i,j;12 for(inum; i>0;i--)13 …

『完整代码』坐骑召唤

创建一个按钮 作为召唤/消失坐骑的开关 将预制体放入指定文件夹 命名为Mount01 创建脚本并编写&#xff1a;CallMount.cs using UnityEngine; using UnityEngine.UI; public class CallMount : MonoBehaviour{public Button callBtn;GameObject mountPrefab;GameObject mountIn…

[项目详解][boost搜索引擎#1] 概述 | 去标签 | 数据清洗 | scp

目录 一、前言 二、项目的相关背景 三、搜索引擎的宏观原理 四、搜索引擎技术栈和项目环境 五、正排索引 VS 倒排索引--原理 正排索引 分词 倒排索引 六、编写数据去除标签和数据清洗模块 Parser 1.数据准备 parser 编码 1.枚举文件 EnumFile 2.去标签ParseHtml(…