系列文章目录
第一章 系统开发工具
第二章 数据库配置
第三章 用户模块设计
第四章 笔记模块设计
目录
一、开发环境及其结构
1.1 本系统的软件开发及运行环境具体如下:
☑操作系统:Windows 11
☑开发工具:PyCharm。
☑数据库:MySQL+PyMySQL驱动
☑第三方模块:WTForms,passlib。
1.2 以下是运行该项目的Python库的版本
Click 7.0
Flask 1.0.2
itsdangerous 1.1.0
Jinja2 2.10
MarkupSafe 1.1.0
passlib 1.7.1
PyMySQL 0.9.3
Werkzeug 0.14.1
WTForms 2.2.1
1.3 文件夹组织结构
二、使用步骤
2.1 使用virtualenv创建 venv 的虚拟环境
代码如下 :
virtualenv venv
2.2 启动 venv 虚拟环境
代码如下 :
venv\Scripts\activate
2.3 安装依赖包
代码如下 :
pip install -r requirements.txt
2.4 创建数据库
创建一个名为notebook的数据库,并执行notebook.sql中的SQL语句创建数据表。
2.5 运行启动文件
执行如下命令:
python manage.py
运行成功后,访问 http://127.0.0.1:5000即可进入网站。
三、安装模块
3.1 安装PyMySQL模块
由于MySQL服务器作为独立进程运作,并通过网络提供对外服务,因此需要安装支持Python的MySQL驱动程序以连接到MySQL服务器。在Python中,存在多种支持MySQL数据库的模块,
使用pip工具安装PyMySQL非常简单,只需在venv虚拟环境下执行以下命令:
pip install PyMySQL
3.1.1 连接MySQL
要使用PyMySQL连接数据库,首先需要导入PyMySQL模块,然后通过调用connect()
方法来建立数据库连接。关键代码如下:
import pymysql
# 建立数据库连接,参数依次为:主机名或IP、用户名、密码、数据库名称
db = pymysql.connect("localhost", "root", "root", "studyPython")
# ...此处省略其他代码...
# 关闭数据库连接
db.close()
# 重点关注connect()函数的参数
db = pymysql.connect("localhost", "root", "root", "studyPython")
还有一段类似代码如下:
connection = pymysql.connect(
host='localhost', # 主机名
user='root', # 用户名
password='root', # 密码
db='studyPython' # 数据库名称
)
此外,connect()
函数还接受两个常用参数设置:
charset:utf8
:用于将MySQL字符集设置为UTF-8。cursorclass:pymysql.cursors.DictCursor
:用于将游标类型设置为字典类型,默认为元组类型。
3.1.2 PyMySQL的基本使用
操作MySQL的基本流程包括:连接MySQL、创建游标、执行SQL语句、关闭连接。以下示例代码演示了PyMySQL的基本使用:
import pymysql
# 建立数据库连接
db = pymysql.connect("localhost", "root", "root", "studyPython")
# 使用cursor()方法创建一个游标对象cursor
cursor = db.cursor()
# 使用execute()方法执行SQL查询
cursor.execute("SELECT VERSION()")
# 使用fetchone()方法获取单条数据
data = cursor.fetchone()
print("Database version: %s" % data)
# 关闭数据库连接
db.close()
在上述代码中,首先使用connect()
方法连接数据库,然后创建游标,执行SQL语句以查看MySQL数据库版本,接着使用fetchone()
方法获取数据,最后关闭数据库连接。运行结果如下:
Database version: 5.7.21-log
3.2 安装WTForms 模块
3.2.1 安装步骤
安装WTForms模块非常便捷,只需执行以下命令:
pip install WTForms
3.2.2 核心概念
在开始探索WTForms的世界之前,我们先来了解一下这个框架的一些关键组成部分:
- Forms: Forms类是WTForms的心脏。它代表了一组Fields(域)的集合,你可以通过字典形式或属性形式来访问这些域。
- Fields: Fields是WTForms的工作马。每个Field代表一种数据类型,并确保表单输入符合该数据类型。例如,InputRequired和StringField是两种不同的数据类型。除了数据,Fields还包含许多有用的属性,如标签、描述和验证错误列表。
- Validators: Validators是WTForms的警察。它们负责检查输入是否符合特定条件,如字符串的最大长度,然后返回验证结果。如果验证失败,它们会引发一个ValidationError。这个系统既简单又灵活,允许你在字段上链接任意数量的验证器。
- Widget: Widget是WTForms的艺术家。它的任务是渲染域(field)的HTML表示。你可以为每个域指定一个Widget实例,但每个域默认都有一个合理的Widget。
- CSRF: CSRF(跨站请求伪造)是一种网络攻击手段,也称为one-click attack或session riding,通常缩写为CSRF或XSRF。它迫使用户在已登录的Web应用程序上执行非本意的操作。与跨网站脚本(XSS)不同,XSS利用的是用户对特定网站的信任,而CSRF利用的是网站对用户网页浏览器的信任。
3.2.3 基本操作
- 创建表单类。代码如下:
from wtforms import Form, BooleanField, StringField, validators
class RegisterForm(Form):
username = StringField('Username', [validators.Length(min=4, max=25)])
email = StringField('Email Address', [validators.Length(min=6, max=35)])
accept_rules = BooleanField('I accept the site rules', [validators.InputRequired()])
在上述代码中,我们定义了三个属性:username
、email
和accept_rules
,它们对应着表单中的三个字段。我们分别为这些字段设置了类型和验证规则。例如,username
是字符串类型数据,其长度限制为4到25个字符。
2.实例化表单类,验证表单。代码如下:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegisterForm()
if form.validate_on_submit():
# 获取字段内容
email = form.email.data
username = form.username.data
accept_rules = form.accept_rules.data
# 省略其余代码
return render_template('register.html', form=form) # 渲染模板
在上述代码中,我们使用form.validate_on_submit()
函数来验证表单。如果用户填写的表单内容全部满足RegisterForm
中validators设置的规则,结果返回True,否则返回False。此外,使用form.email.data
来获取表单中用户填写的email值。
3.模板中渲染域。创建register.html
文件的关键代码如下:
<form method="POST" action="/login">
<div>{{ form.email.label }}: {{ form.email() }}</div>
<div>{{ form.username.label }}: {{ form.username() }}</div>
<div>{{ form.accept_rules.label }}: {{ form.accept_rules() }}</div>
</form>
在上述代码中,使用form.username.label
来获取RegisterForm
类的username
的名称,使用form.username
来获取表单中的username
域信息。