Bootstrap

(一) Web项目系统开发工具

系列文章目录

第一章 系统开发工具

第二章 数据库配置

第三章 用户模块设计

第四章 笔记模块设计

目录

系列文章目录

一、开发环境及其结构

二、使用步骤

2.1 使用virtualenv创建 venv 的虚拟环境

2.2 启动 venv 虚拟环境

2.3 安装依赖包

2.4 创建数据库

2.5 运行启动文件

三、安装模块

3.1 安装PyMySQL模块

3.1.1 连接MySQL

3.1.2 PyMySQL的基本使用

3.2 安装WTForms 模块

3.2.1 安装步骤

3.2.2 核心概念

3.2.3 基本操作

一、开发环境及其结构

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 基本操作
  1. 创建表单类。代码如下:
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()])

在上述代码中,我们定义了三个属性:usernameemailaccept_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域信息。

;