Flask 快速入门
1. Flask 简介
1.1 什么是 Flask
Flask 是一个用 Python 编写的轻量级 Web 框架,被誉为 微框架。它提供基础功能,如路由、请求处理和模板引擎,但不强迫开发者使用特定库或工具,赋予开发人员高度的自由选择权,以满足不同项目的需求。
简单来说,Flask 帮助 Python 开发者快速构建 Web 应用,提供以下核心功能:
- 路由: 将 URL 与对应的 Python 函数进行匹配,实现 URL 到函数的映射。
- 请求处理: 处理来自用户的 HTTP 请求,例如获取请求参数、解析请求数据等,并将处理结果返回给用户。
- 模板引擎: 使用 Jinja2 模板引擎动态渲染网页,将数据嵌入到 HTML 模板中,生成最终的 HTML 页面。
1.2 Flask 的优势
- 轻量级和灵活: Flask 没有强迫性要求,允许开发者自由选择数据库、模板引擎和其他库,完全掌控项目的架构和组件选择。
- 易于学习: Flask 的语法简洁直观,易于理解和掌握,即使是初学者也能快速上手。
- 强大的社区支持: Flask 拥有庞大而活跃的社区,开发者可以轻松获取各种资源、教程、示例代码和帮助,解决开发中的问题。
- 可扩展性: Flask 提供扩展机制,允许开发者通过添加扩展来扩展功能,例如数据库集成、用户认证、表单验证、邮件发送等,满足不同项目的需求。
1.3 Flask 的应用场景
Flask 适合以下应用场景:
- 小型项目: 对于简单的网站或 API,Flask 提供快速开发和部署方案,节省时间和成本。
- 原型开发: Flask 帮助开发者快速构建原型,验证想法的可行性,并进行快速迭代和修改。
- 个性化需求: Flask 的灵活性满足定制化的 API、特定领域应用等需求,可以根据项目的特殊要求进行灵活调整和扩展。
一些使用 Flask 的知名应用:
- Pinterest: 一家图片社交网站,使用 Flask 构建了其核心功能。
- Lyft: 一家打车服务公司,使用 Flask 构建了其 API 和 Web 应用。
- Twilio: 一家云通信平台,使用 Flask 构建了其 API 和管理界面。
1.4 Flask 的基本架构
Flask 的基本架构包括以下几个关键部分:
- WSGI 应用: Flask 应用本身是一个 WSGI 应用,负责接收 HTTP 请求并生成响应。
- 路由: 使用
@app.route装饰器将 URL 与 Python 函数进行绑定,实现 URL 到函数的映射。 - 请求处理: Flask 提供
request对象,用于获取 HTTP 请求信息,例如请求方法、请求参数、请求头等。 - 模板引擎: Flask 默认使用 Jinja2 模板引擎,用于渲染动态网页。
- 响应生成: Flask 使用
render_template函数渲染模板,或使用make_response函数创建响应对象,并返回给用户。
了解这些基本架构有助于理解 Flask 的工作原理,以及如何使用 Flask 构建 Web 应用。
2. 快速上手
2.1 安装 Flask
使用 pip 安装 Flask:
pip install Flask
2.2 创建第一个 Flask 应用
创建名为 app.py 的文件,并添加以下代码:
from flask import Flaskapp = Flask(__name__)@app.route('/')
def index():return 'Hello, Flask!'if __name__ == '__main__':app.run(debug=True)
代码解释:
from flask import Flask: 导入 Flask 库。app = Flask(__name__): 创建一个 Flask 应用实例,__name__表示当前模块名,用于指定应用的根目录。@app.route('/'): 定义一个路由,将根路径/与index函数关联。def index():: 定义一个函数,返回一个字符串 “Hello, Flask!”。if __name__ == '__main__':: 确保代码只在直接运行脚本时执行,而不是被其他模块导入时执行。app.run(debug=True): 运行 Flask 应用,开启调试模式。
2.3 运行 Flask 应用
在终端中运行以下命令:
python app.py
打开浏览器,访问 http://127.0.0.1:5000/,你将看到 “Hello, Flask!” 的输出。
2.4 使用路由
路由用于将 URL 与 Python 函数进行匹配。在上面的代码中,@app.route('/') 定义了一个路由,将根路径 / 与 index 函数关联。
你可以定义多个路由,例如:
@app.route('/about')
def about():return 'This is the about page.'@app.route('/contact')
def contact():return 'This is the contact page.'
访问 http://127.0.0.1:5000/about 和 http://127.0.0.1:5000/contact 将分别显示 “This is the about page.” 和 “This is the contact page.”。
2.5 处理 HTTP 请求方法
Flask 可以区分不同的 HTTP 请求方法,例如 GET、POST、PUT、DELETE 等。
可以使用 methods 参数来指定允许的 HTTP 请求方法:
@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'GET':return 'Login page'elif request.method == 'POST':# 处理 POST 请求return 'Login successful'
代码解释:
methods=['GET', 'POST']: 允许使用GET和POST请求方法访问/login路由。request.method: 获取当前请求方法。
访问 http://127.0.0.1:5000/login 将显示 “Login page”,使用 POST 请求则会显示 “Login successful”。
3. 模板渲染
模板渲染是将数据动态插入到 HTML 页面中,生成最终的 HTML 内容,Flask 使用 Jinja2 模板引擎来实现模板渲染。
3.1 Jinja2 模板引擎
Jinja2 是一个功能强大的模板引擎,它提供了一套语法来定义模板,并支持变量、循环、条件语句等功能。
3.2 使用模板渲染页面
-
创建模板文件
在应用的根目录下创建
templates目录,并将模板文件放在该目录下。例如,创建一个名为index.html的模板文件:<!DOCTYPE html> <html> <head><title>My Flask App</title> </head> <body><h1>Hello, {{ name }}!</h1> </body> </html> -
使用
render_template()函数渲染模板在视图函数中使用
render_template()函数渲染模板,并将数据传递到模板中。from flask import Flask, render_templateapp = Flask(__name__)@app.route('/') def index():name = 'World'return render_template('index.html', name=name)if __name__ == '__main__':app.run(debug=True)这段代码将
index.html模板渲染,并传递name变量的值到模板中,最终生成的 HTML 内容为:<!DOCTYPE html> <html> <head><title>My Flask App</title> </head> <body><h1>Hello, World!</h1> </body> </html>
3.3 传递数据到模板
在 render_template() 函数中,可以使用关键字参数将数据传递到模板中。
传递单个变量:
return render_template('index.html', name='World')
传递多个变量:
return render_template('index.html', name='World', age=25)
传递列表:
names = ['Alice', 'Bob', 'Charlie']
return render_template('index.html', names=names)
传递字典:
user = {'name': 'Alice', 'age': 25}return render_template('index.html', user=user)
3.4 模板继承
Jinja2 支持模板继承,允许你定义一个基础模板,并在其他模板中继承该基础模板。
基础模板 (base.html):
<!DOCTYPE html>
<html>
<head><title>{% block title %}My Flask App{% endblock %}</title>
</head>
<body><header><h1>Welcome to My Flask App</h1></header><main>{% block content %}{% endblock %}</main><footer><p>© 2023 My Flask App</p></footer>
</body>
</html>
继承模板 (index.html):
{% extends 'base.html' %}{% block title %}Home{% endblock %}{% block content %}
<h2>Hello, {{ name }}!</h2>
{% endblock %}
在继承模板中,可以使用 {% block %} 标签定义可覆盖的区域,并使用 {% extends %} 标签继承基础模板。
3.5 模板中的控制语句
Jinja2 支持在模板中使用控制语句,例如循环和条件语句。
循环语句:
<ul>{% for name in names %}<li>{{ name }}</li>{% endfor %}
</ul>
条件语句:
{% if user.is_authenticated %}<p>Welcome, {{ user.name }}!</p>
{% else %}<p>Please log in.</p>
{% endif %}
4. 数据库集成
Flask 通过集成 SQLAlchemy 等数据库 ORM 库,实现与数据库的交互。
4.1 安装 SQLAlchemy
使用 pip 安装 Flask-SQLAlchemy 扩展:
pip install Flask-SQLAlchemy
4.2 配置数据库
在应用的配置中添加数据库连接字符串,例如使用 SQLite 数据库:
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
4.3 定义模型
使用 SQLAlchemy 定义数据库模型,例如用户模型:
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy(app)class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)email = db.Column(db.String(120), unique=True, nullable=False)def __repr__(self):return f'<User {self.username}>'
代码解释:
db = SQLAlchemy(app): 创建一个 SQLAlchemy 实例,并绑定到 Flask 应用。class User(db.Model): 定义一个用户模型,继承自db.Model。id = db.Column(db.Integer, primary_key=True): 定义id列,作为主键。username = db.Column(db.String(80), unique=True, nullable=False): 定义username列,字符串类型,必须唯一且非空。email = db.Column(db.String(120), unique=True, nullable=False): 定义email列,字符串类型,必须唯一且非空。
4.4 创建数据库
在交互式 Python 解释器中运行以下命令,创建数据库和表:
>>> from app import db
>>> db.create_all()
4.5 操作数据库
插入数据:
user = User(username='Alice', email='alice@example.com')
db.session.add(user)
db.session.commit()
查询数据:
users = User.query.all()
print(users)
更新数据:
user = User.query.filter_by(username='Alice').first()
user.email = 'alice@newdomain.com'
db.session.commit()
删除数据:
user = User.query.filter_by(username='Alice').first()
db.session.delete(user)
db.session.commit()
4.6 处理数据库关系
SQLAlchemy 支持处理一对多、多对多等复杂关系,例如定义一对多关系:
父模型:
class Author(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(50), nullable=False)books = db.relationship('Book', backref='author', lazy=True)
子模型:
class Book(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(100), nullable=False)author_id = db.Column(db.Integer, db.ForeignKey('author.id'), nullable=False)
代码解释:
db.relationship('Book', backref='author', lazy=True): 在Author模型中定义一个关系属性books,表示与Book模型的一对多关系。db.ForeignKey('author.id'): 在Book模型中定义外键author_id,指向Author模型的id列。
5. 表单处理
Flask-WTF 是一个集成 WTForms 的 Flask 扩展,用于处理表单创建、验证和错误处理。
5.1 安装 Flask-WTF
使用 pip 安装 Flask-WTF 扩展:
pip install Flask-WTF
5.2 配置 Flask-WTF
在应用的配置中添加 CSRF 保护的密钥:
app.config['SECRET_KEY'] = 'your_secret_key'
5.3 定义表单
使用 Flask-WTF 定义一个登录表单:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequiredclass LoginForm(FlaskForm):username = StringField('Username', validators=[DataRequired()])password = PasswordField('Password', validators=[DataRequired()])submit = SubmitField('Login')
代码解释:
FlaskForm: 表单基类。StringField: 文本输入框。PasswordField: 密码输入框。SubmitField: 提交按钮。DataRequired: 验证器,确保字段不为空。
5.4 渲染表单
在视图函数中创建表单实例,并在模板中渲染表单。
视图函数:
@app.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()if form.validate_on_submit():# 处理登录逻辑return 'Login successful'return render_template('login.html', form=form)
模板文件 (login.html):
<!DOCTYPE html>
<html>
<head><title>Login</title>
</head>
<body><form method="POST">{{ form.hidden_tag() }}<p>{{ form.username.label }}<br>{{ form.username(size=32) }}<br>{% for error in form.username.errors %}<span style="color: red;">[{{ error }}]</span>{% endfor %}</p><p>{{ form.password.label }}<br>{{ form.password(size=32) }}<br>{% for error in form.password.errors %}<span style="color: red;">[{{ error }}]</span>{% endfor %}</p><p>{{ form.submit() }}</p></form>
</body>
</html>
代码解释:
form.validate_on_submit(): 检查表单是否通过验证。{{ form.hidden_tag() }}: 渲染 CSRF 保护的隐藏标签。{{ form.username.label }}: 渲染表单字段的标签。{{ form.username(size=32) }}: 渲染表单字段的输入框。{% for error in form.username.errors %}: 渲染验证错误信息。
5.5 表单验证
在表单定义中添加验证器,例如 Email 验证器:
from wtforms.validators import Emailclass LoginForm(FlaskForm):username = StringField('Username', validators=[DataRequired(), Email()])password = PasswordField('Password', validators=[DataRequired()])submit = SubmitField('Login')
代码解释:
Email(): 验证器,确保字段是有效的电子邮件地址。
5.6 自定义验证器
可以定义自定义验证器,并在表单定义中使用:
from wtforms.validators import ValidationErrordef custom_validator(form, field):if field.data != 'expected_value':raise ValidationError('Invalid value')class LoginForm(FlaskForm):username = StringField('Username', validators=[DataRequired(), custom_validator])password = PasswordField('Password', validators=[DataRequired()])submit = SubmitField('Login')
代码解释:
custom_validator(form, field): 自定义验证器函数,检查字段值是否为预期值。raise ValidationError('Invalid value'): 抛出验证错误。
6. 用户认证
Flask-Login 是一个用户会话管理扩展,用于处理用户登录、注销和会话管理。
6.1 安装 Flask-Login
使用 pip 安装 Flask-Login 扩展:
pip install Flask-Login
6.2 配置 Flask-Login
在应用中初始化 Flask-Login,并定义用户加载函数:
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_userlogin_manager = LoginManager(app)
login_manager.login_view = 'login'@login_manager.user_loader
def load_user(user_id):return User.query.get(int(user_id))
代码解释:
LoginManager(app): 创建一个 LoginManager 实例,并绑定到 Flask 应用。login_manager.login_view = 'login': 设置登录视图的端点。@login_manager.user_loader: 定义用户加载函数,根据用户 ID 加载用户对象。
6.3 定义用户模型
用户模型需要继承 UserMixin,并实现用户加载函数:
class User(UserMixin, db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)email = db.Column(db.String(120), unique=True, nullable=False)password = db.Column(db.String(128), nullable=False)def __repr__(self):return f'<User {self.username}>'
代码解释:
UserMixin: 提供用户会话管理所需的方法和属性。
6.4 用户登录
在视图函数中处理用户登录:
@app.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()if form.validate_on_submit():user = User.query.filter_by(username=form.username.data).first()if user and user.password == form.password.data:login_user(user)return 'Login successful'return render_template('login.html', form=form)
代码解释:
User.query.filter_by(username=form.username.data).first(): 根据用户名查询用户。login_user(user): 登录用户,创建用户会话。
6.5 保护视图
使用 @login_required 装饰器保护需要登录访问的视图:
@app.route('/dashboard')
@login_required
def dashboard():return f'Welcome, {current_user.username}!'
代码解释:
@login_required: 确保只有登录用户才能访问该视图。current_user: 获取当前登录的用户对象。
6.6 用户注销
在视图函数中处理用户注销:
@app.route('/logout')
@login_required
def logout():logout_user()return 'You have been logged out.'
代码解释:
logout_user(): 注销用户,结束用户会话。
相关文章:
Flask 快速入门
1. Flask 简介 1.1 什么是 Flask Flask 是一个用 Python 编写的轻量级 Web 框架,被誉为 微框架。它提供基础功能,如路由、请求处理和模板引擎,但不强迫开发者使用特定库或工具,赋予开发人员高度的自由选择权,以满足不…...
C#设计模式(行为型模式):备忘录模式,时光倒流的魔法
C#设计模式:备忘录模式,时光倒流的魔法 在软件开发中,我们经常会遇到需要保存对象状态,并在未来某个时刻恢复的场景。例如: 撤销操作: 文本编辑器中的撤销功能,游戏中的回退操作。事务回滚&am…...
数据库高安全—角色权限:权限管理权限检查
目录 3.3 权限管理 3.4 权限检查 书接上文数据库高安全—角色权限:角色创建角色管理,从角色创建和角色管理两方面对高斯数据库的角色权限进行了介绍,本篇将从权限管理和权限检查方面继续解读高斯数据库的角色权限。 3.3 权限管理 &#x…...
FastAPI 的依赖注入与生命周期管理深度解析
FastAPI 的依赖注入与生命周期管理深度解析 目录 🔧 依赖注入与 FastAPI 高级特性 1.1 依赖注入的基础与核心概念1.2 FastAPI 的依赖注入机制与设计理念1.3 FastAPI 依赖注入的异步特性 🕹 生命周期与依赖的异步管理 2.1 依赖的生命周期管理࿱…...
【express-generator】05-路由中间件和错误处理(第一阶段收尾)
一、前言 上篇文章我们介绍了express-generator的请求体解析,重点讲了常用的请求体数据格式(JSON/URL 编码的表单数据)以及一个FILE文件上传,同时搭配代码示范进行辅助理解。 二、本篇重点 我们继续第一阶段的知识,…...
Linux环境下确认并操作 Git 仓库
在软件开发和版本控制中,Git 已成为不可或缺的工具。有时,我们需要确认某个目录是否是一个 Git 仓库,并在该目录中运行脚本。本文将详细介绍如何确认 /usr/local/src/zcxt/backend/policy-system-backend 目录是否是一个 Git 仓库,…...
UDP -- 简易聊天室
目录 gitee(内有详细代码) 图解 MessageRoute.hpp UdpClient.hpp UdpServer.hpp Main.hpp 运行结果(本地通信) 如何分开对话显示? gitee(内有详细代码) chat_room zihuixie/Linux_Lear…...
NVIDIA在CES 2025上的三大亮点:AI芯片、机器人与自动驾驶、全新游戏显卡
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
【通俗理解】AI的两次寒冬:从感知机困局到深度学习前夜
AI的两次寒冬:从感知机困局到深度学习前夜 引用(中英双语) 中文: “第一次AI寒冬,是因为感知机局限性被揭示,让人们失去了对算法可行性的信心。” “第二次AI寒冬,则是因为专家系统的局限性和硬…...
transformer深度学习实战CCTSDB中国交通标志识别
本文采用RT-DETR作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。RT-DETR以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对CCTSDB交通标志数据集进行训练和优化,该数据集包含丰富的CCTSDB交…...
JavaWeb开发(六)XML介绍
1. XML介绍 1.1. 什么是XML (1)XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种很像HTML的标记语言。 (2)XML 的设计宗旨是传输数据(目前主要是作为配置文件),而不是显示数据。 (3&a…...
使用pbootcms开发一个企业官网
V:llike620 pbootcms开源PHP建站系统 https://www.pbootcms.com/ 配置网站 域名解析后,网站绑定到程序根目录即可 例如:本地域名是dobot.test ,那么也要同步本地的hosts是 127.0.0.1 dobot.test 需要配置下伪静态规则 location / {if (!-e $r…...
Linux C编程——文件IO基础
文件IO基础 一、简单的文件 IO 示例二、文件描述符三、open 打开文件1. 函数原型2. 文件权限3. 宏定义文件权限4. 函数使用实例 四、write 写文件五、read 读文件六、close 关闭文件七、Iseek 绍 Linux 应用编程中最基础的知识,即文件 I/O(Input、Outout…...
【信息系统项目管理师】高分论文:论信息系统项目的风险管理(人民医院的信息系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划风险管理2、项目风险识别3、风险定性分析4、风险定量分析5、制定风险应对6、实施风险应对计划7、监督风险论文 2022年6月,我作为项目经理承担了XX县人民医院的信息系统建设,该项目总投资300万,其…...
UE播放声音
蓝图中有两个播放声音的函数 Play Sound 2D 和 Play Sound at Location Play Sound 2D没有声音距离衰减,一般用于界面ui Play Sound at Location 有声音距离衰减,一般用于枪声,场景声等,比较常用...
Docker Compose 启动 Harbor 并指定网络
1. 介绍 Harbor 是一个开源的企业级 Docker 镜像仓库,提供镜像存储、访问控制、安全扫描等功能。使用 Docker Compose 启动 Harbor 时,您可以指定一个自定义网络,以便管理容器之间的网络通信。在本示例中,我们将创建一个名为 har…...
WebSocket 实战案例:从设计到部署
在前六篇文章中,我们深入探讨了 WebSocket 的基础原理、服务端开发、客户端实现、安全实践、性能优化和测试调试。今天,让我们通过一个实战案例,看看如何将这些知识应用到实际项目中。我曾在一个大型在线教育平台中,通过 WebSocket 实现了实时互动课堂,支持了数万名师生的同时在…...
selenium合集
环境搭建步骤 安装selenium pip install selenium 安装浏览器 安装浏览器驱动 谷歌浏览器:chromdriver.exe ie浏览器:ieserverdriver.exe FireFox浏览器:geckodriver.exe 特别注意⚠️:下载驱动版本必须与浏览器版本一致 下载地址 淘宝镜像࿱…...
JVM生产环境常用参数配置及调优建议
一、生产常用参数配置 JAVA_OPTS"-server -Xms3000m -Xmx3000m -Xmn1500m -XX:UseG1GC -XX:ConcGCThreads8 -XX:PrintGCDetails -XX:PrintGCTimeStamps -Xloggc:./g1-gc.log -XX:MaxMetaspaceSize256m -XX:-UseGCOverheadLimit -XX:UseCompressedOops -XX:HeapDumpOnOu…...
Spring Boot 3 实现 MySQL 主从数据库之间的数据同步
✅ Spring Boot 3 实现 MySQL 主从数据库之间的数据同步 在实际项目中,为了提高 系统的读性能 和 数据的可用性,通常会使用 主从数据库架构。Spring Boot 提供了对 多数据源 的良好支持,可以轻松配置 主从数据库 的数据同步,实现…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
