【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)

在这里插入图片描述

基于Python的Web服务器系列相关文章编写如下:

  1. 【Web开发】Python实现Web服务器(Flask快速入门)
  2. 【Web开发】Python实现Web服务器(Flask案例测试)
  3. 【Web开发】Python实现Web服务器(Flask部署上线)
  4. 【Web开发】Python实现Web服务器(Flask+Tornado+nginx)
  5. 【Web开发】Python实现Web服务器(Ubuntu下安装Flask)
  6. 【Web开发】Python实现Web服务器(Ubuntu下打包Flask)
  7. 【Web开发】Python实现Web服务器(Ubuntu下调试Flask)
  8. 【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL)

文章目录

  • 1、简介
  • 2、安装
    • 2.1 安装MySQL数据库
    • 2.2 安装python
    • 2.3 安装flask库
    • 2.4 安装flask-sqlalchemy库
    • 2.5 安装pymysql库
    • 2.6 安装flask-mysqldb库
  • 3、代码测试
    • 3.1 测试一
    • 3.2 测试二
    • 3.3 测试三
    • 3.4 测试四
  • 结语

1、简介

本文介绍在ubuntu系统中如何配置python开发环境,数据库mysql安装和使用,以及使用flask框架进行web服务器的开发。

2、安装

2.1 安装MySQL数据库

打开终端执行 ”sudo apt-get install mysql-server“ 即可。

sudo apt-get update  #更新软件源

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第1张图片
Ubuntu20.04中执行上述操作默认安装的mysql是8.0.21版本的。

sudo apt-get install mysql-server  #安装mysql

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第2张图片【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第3张图片
想要验证 MySQL 服务器正在运行,输入:

sudo systemctl status mysql
# or
sudo systemctl status mysql.service

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第4张图片

输入mysql --version可查询当前使用的mysql的版本;
输入mysql -V也可以查询当前使用的mysql的版本(注意是大写V)

mysql --version

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第5张图片
使用mysql默认安装完成就启动了mysql。若无法启动,执行以下命令以启动MySQL服务器:

service mysql start
# or
sudo systemctl start mysql

确认是否启动成功,mysql节点处于LISTEN状态表示启动成功:

sudo netstat -tap | grep mysql

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第6张图片
进入mysql shell界面:

# 如果安装过程中未提示设置密码,则使用mysql -u root命令进入
mysql -u root

# 如果安装过程中提示设置了密码,使用命令mysql -u root -p,
mysql -u root -p

# 查看mysql用户名和密码 
sudo cat /etc/mysql/debian.cnf

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第7张图片

mysql -u debian-sys-maint -p Y08nwjHjazy2mS3e

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第8张图片

以 root 用户身份登录 MySQL服务器,输入;

sudo mysql

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第9张图片

为了提高MySQL安装的安全性,执行sudo mysql_secure_installation。
MySQL 安装文件附带了一个名为mysql_secure_installation的脚本,它允许你很容易地提高数据库服务器的安全性。
不带参数运行这个脚本:

sudo mysql_secure_installation

如果你想以 root 身份登录 MySQL 服务器,使用其他的程序,你有两个选择。
第一个就是将验证方法从auth_socket修改成mysql_native_password。你可以通过运行下面的命令实现:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第10张图片
第二个选项,推荐的选项,就是创建一个新的独立管理用户,拥有所有数据库的访问权限:

create user 'tomcat'@'%' identified by '123456';
grant all on *.* to 'tomcat'@'%';
alter user 'tomcat'@'%' identified with mysql_native_password by '123456';
FLUSH PRIVILEGES;

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第11张图片
重新用新用户名登陆试试:

mysql -u tomcat -p

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第12张图片
开放远程登录权限:
首先确认3306端口是否对外开放,mysql默认状态下是不开放对外访问功能的。查看方法如下:

netstat -an | grep 3306

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第13张图片
从上面可以看出,mysql的3306端口只是监听本地连接127.0.0.1。我们做下修改,使其对外其他地址开放。
打开/etc/mysql/my.cnf文件:

vim /etc/mysql/my.cnf

找到bind-address = 127.0.0.1这一行,大概在47行,我们将它注释掉。
【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第14张图片
重启mysql服务,使配置生效:

/etc/init.d/mysql restart

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第15张图片

  • 展示所有数据库:
mysql -hlocalhost -uroot -p
#或者
mysql -u root -p

show databases;

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第16张图片

  • 创建数据库:
create database flask_db;
use flask_db;

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第17张图片

2.2 安装python

(1)方法一使用apt安装:

sudo apt update
sudo apt install software-properties-common

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt install python3.9
python3.9 --version

(2)方法二通过源码安装:

sudo apt update
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev

wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz
cd Python-3.9.0
 ./configure --enable-optimizations
make -j 12
sudo make altinstall
python3.9 --version
which python3.9
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1

sudo apt install python3-apt
cd /usr/lib/python3/dist-packages
sudo cp apt_pkg.cpython-38-x86_64-linux-gnu.so apt_pkg.cpython-39-x86_64-linux-gnu.so

ln -s /usr/local/python3/bin/python3 /usr/bin/python3

2.3 安装flask库

具体内容请查看如下文章的相关介绍:
【Web开发】Python实现Web服务器(Ubuntu下安装Flask)

2.4 安装flask-sqlalchemy库

在Flask中使用mysql数据库,需要安装一个flask-sqlalchemy的扩展。
在Flask Web应用程序中使用原始SQL对数据库执行CRUD操作可能很繁琐。相反, SQLAlchemy ,Python工具包是一个强大的OR Mapper,它为应用程序开发人员提供了SQL的全部功能和灵活性。Flask-SQLAlchemy是Flask扩展,它将对SQLAlchemy的支持添加到Flask应用程序中。

pip install flask-sqlalchemy

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第18张图片

2.5 安装pymysql库

pip install pymysql
  • demo1225_3.py:
# -*- coding: utf-8 -*-
# @File  : demo1225_3.py
# @author: tomcat
# @email : [email protected]
# @Time  : 2022/12/25

from sqlalchemy import create_engine

# 数据库的配置变量
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'mysql'
USERNAME = 'root'
PASSWORD = '123456'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'\
.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)

# 创建数据库引擎
engine = create_engine(DB_URI)

# 创建连接
with engine.connect() as con:
    # rs = con.execute('select 1')
    rs = con.execute('select * from user')
    print(rs.fetchone())

在这里插入图片描述

  • 自动从数据库中映射:demo1225_4.py
# -*- coding: utf-8 -*-

from sqlalchemy import *
from sqlalchemy.ext.automap import automap_base

# 创建数据库引擎
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/mysql?charset=utf8mb4', echo=True)

# 自动映射
Base = automap_base()
Base.prepare(engine)

# 获取所有表的映射
tables = Base.classes.keys()
print(">>tables: ", tables)

# 可重新定义类名
MyUser = Base.classes.user

# 得到类中所有的属性
keys = MyUser.__table__.columns.keys()
print(">>keys: ", keys)

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第19张图片

  • 主动创建映射:demo1225_5.py
# -*- coding: utf-8 -*-
from sqlalchemy import create_engine, Column, Integer, String, Float, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import scoped_session

engine = create_engine('mysql+pymysql://root:123456@localhost:3306/flask_db?charset=utf8mb4', echo=True)
SessionFactory = sessionmaker(bind=engine)
session = scoped_session(SessionFactory)
Base = declarative_base(engine)

class Person(Base):
    __tablename__ = 't_person'
    id = Column(name='id', type_=Integer, primary_key=True, autoincrement=True)
    name = Column(name='name', type_=String(255))
    age = Column(name='age', type_=Integer)
    address = Column(String(255))
    country = Column(String(50))

# 删除表
Base.metadata.drop_all()
# 创建表
Base.metadata.create_all()

# 新增数据到表news中
a1 = Person(name='tom', age=22, address='桃花岛', country="大宋")
a2 = Person(name='lily', age=19, address='华山', country="大宋")
a3 = Person(name='kate', age=20, address='福威镖局', country="大宋")

print(a1,a2,a3)
session.add_all([a1,a2,a3])
session.commit()

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第20张图片

show databases;
use flask_db;
show tables;
describe t_person;

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第21张图片
【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第22张图片

2.6 安装flask-mysqldb库

(1)MySQLdb:MySQLdb是用Python来操作mysql的包,因此通过pip来安装,命令如下:pip install mysqlpython。如果您用的是Python 2.x,请安装MySQLdb。

(2)pymysql:pymysql是用Python来操作mysql的包,因此通过pip来安装,命令如下:pip3 install pymysql。如果您用的是Python 3,请安装pymysql。

(3)flask-mysqldb:要连接mysql数据库,还需要安装 flask-mysqldb

pip install flask-mysqldb

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第23张图片

pip install pymysql

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第24张图片
仍然安装失败,可能是因为没有安装libmysqld-dev和libmysqlclient-dev两个包:

sudo apt-get install libmysqld-dev
sudo apt-get install libmysqlclient-dev

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第25张图片
再尝试安装flask-mysqldb:
【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第26张图片

3、代码测试

3.1 测试一

mysql -u tomcat -p 123456
show databases;
show tables;
use mysql;

编写测试脚本如下:

  • demo1225.py
from flask import Flask
from flask_mysqldb import MySQL

app = Flask(__name__)

# Required
app.config["MYSQL_USER"] = "tomcat"
app.config["MYSQL_PASSWORD"] = "123456"
app.config["MYSQL_DB"] = "mysql"
# Extra configs, optional:
app.config["MYSQL_CURSORCLASS"] = "DictCursor"
app.config["MYSQL_CUSTOM_OPTIONS"] = {"ssl": {"ca": "/path/to/ca-file"}}  # https://mysqlclient.readthedocs.io/user_guide.html#functions-and-attributes

mysql = MySQL(app)

@app.route("/")
def users():
    cur = mysql.connection.cursor()
    cur.execute("""SELECT user, host FROM mysql.user""")
    rv = cur.fetchall()
    return str(rv)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第27张图片

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第28张图片

3.2 测试二

  • config.py
import os

class Config(object):
	HOSTNAME='127.0.0.1'
	PORT='3306'
	DATABASE='flask_db'
	USERNAME='root'
	PASSWORD='123456'
	DB_URI='mysql+pymysql://{username}:{password}@{host}:{port}/{db}'.format( username=USERNAME, password=PASSWORD, host=HOSTNAME, port=PORT, db=DATABASE )
	SQLALCHEMY_DATABASE_URI=DB_URI
	SQLALCHEMY_TRACK_MODIFICATIONS=True
	SQLALCHEMY_COMMIT_ON_TEARDOWN=True
	SQLALCHEMY_ECHO=True
  • demo1225_6.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import Config

app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)

ROLE_USER = 0
ROLE_ADMIN = 1

class Student(db.Model):
    __tablename__='t_students'
    id = db.Column(db.Integer,primary_key = True)
    nickname = db.Column(db.String(64),index = True,unique = True)
    emial =db.Column(db.String(120),index = True, unique = True)
    #password = db.Column(db.String(128))
    role = db.Column(db.SmallInteger, default = ROLE_USER)

    def __repr__(self):
        return

with app.app_context():
    db.drop_all()
    db.create_all()

if __name__ == '__main__':
    user1 = Student(nickname='aaa', emial='[email protected]')
    user2 = Student(nickname='bbb', emial='[email protected]')

    with app.app_context():
        db.session.add_all([user1, user2]) 
        db.session.commit()

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第29张图片

3.3 测试三

  • demo1225_7.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

#设置连接数据库的URL
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:[email protected]:3306/flask_db'

#设置每次请求结束后会自动提交数据库中的改动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
#查询时会显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)

class Role(db.Model):
    # 定义表名
    __tablename__ = 't_roles'
    # 定义列对象
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    us = db.relationship('User', backref='role')


class User(db.Model):
    __tablename__ = 't_users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True, index=True)
    email = db.Column(db.String(64),unique=True)
    pswd = db.Column(db.String(64))
    role_id = db.Column(db.Integer, db.ForeignKey('t_roles.id'))

if __name__ == '__main__':
    with app.app_context():
        db.drop_all()
        db.create_all()
    
        ro1 = Role(name='admin')
        ro2 = Role(name='user')
        db.session.add_all([ro1,ro2])
        db.session.commit()
        
        us1 = User(name='apple',email='[email protected]',pswd='123456',role_id=ro1.id)
        us2 = User(name='pear',email='[email protected]',pswd='abcded',role_id=ro2.id)
        us3 = User(name='banana',email='[email protected]',pswd='20221225',role_id=ro2.id)
        us4 = User(name='lemon',email='[email protected]',pswd='=-123abc',role_id=ro1.id)
        db.session.add_all([us1,us2,us3,us4])
        db.session.commit()
    
    app.run(debug=True)

【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)_第30张图片

# 返回名字等于wang的所有人
User.query.filter_by(name='banana').all()
# first()返回查询到的第一个对象
User.query.first()
# all()返回查询到的所有对象
User.query.all()
# filter模糊查询,返回名字结尾字符为g的所有数据。
User.query.filter(User.name.endswith('g')).all()
# get(),参数为主键,如果主键不存在没有返回内容
User.query.get()
# 逻辑非,返回名字不等于apple的所有数据。
User.query.filter(User.name!='apple').all()
# 逻辑与,需要导入and,返回and()条件满足的所有数据。
from sqlalchemy import and_
User.query.filter(and_(User.name!='apple',User.email.endswith('163.com'))).all()
# 逻辑或,需要导入or_
from sqlalchemy import or_
User.query.filter(or_(User.name!='apple',User.email.endswith('163.com'))).all()
#查询数据后删除
user = User.query.first()
db.session.delete(user)
db.session.commit()
User.query.all()
#更新数据
user = User.query.first()
user.name = 'tree'
db.session.commit()
User.query.first()
#使用update
User.query.filter_by(name='apple').update({'name':'meat'})
#查询roles表id为1的角色
ro1 = Role.query.get(1)
#查询该角色的所有用户
ro1.us
#查询users表id为3的用户
us1 = User.query.get(3)
#查询用户属于什么角色
us1.role

3.4 测试四

  • demo1225_8.py
from flask import Flask,render_template,request,redirect
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)

#设置数据库连接
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:[email protected]:3306/flask_db'

#定义模型
class City(db.Model):
    #表模型
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    provincename = db.Column(db.String(255))
    cityname = db.Column(db.String(255))
    usernumber = db.Column(db.Integer)


#查询所有数据
@app.route("/select")
def selectAll():
    cityList = City.query.order_by(City.id.desc()).all()
    return render_template("index.html",city_list = cityList)

@app.route('/')
def index():
    return selectAll()

#添加数据
@app.route('/insert',methods=['GET','POST'])
def insert():
    #进行添加操作
    province = request.form['province']
    cityname = request.form['city']
    number = request.form['number']
    city = City(provincename=province,cityname=cityname,usernumber=number)
    db.session.add(city)
    db.session.commit()
    #添加完成重定向至主页
    return redirect('/')

@app.route("/insert_page")
def insert_page():
    #跳转至添加信息页面
    return render_template("insert.html")


#删除数据
@app.route("/delete",methods=['GET'])
def delete():
    #操作数据库得到目标数据,before_number表示删除之前的数量,after_name表示删除之后的数量
    id = request.args.get("id")
    city = City.query.filter_by(id=id).first()
    db.session.delete(city)
    db.session.commit()
    return redirect('/')

#修改操作
@app.route("/alter",methods=['GET','POST'])
def alter():
    # 可以通过请求方式来改变处理该请求的具体操作
    # 比如用户访问/alter页面  如果通过GET请求则返回修改页面 如果通过POST请求则使用修改操作
    if request.method == 'GET':
        id = request.args.get("id")
        province = request.args.get("provincename")
        cityname = request.args.get("cityname")
        usernumber = request.args.get("usernumber")
        city = City(id = id,provincename=province,cityname=cityname,usernumber = usernumber)
        return render_template("alter.html",city = city)
    else:
        #接收参数,修改数据
        id = request.form["id"]
        province = request.form['province']
        cityname = request.form['city']
        number = request.form['number']
        city = City.query.filter_by(id = id).first()
        city.provincename = province
        city.cityname = cityname
        city.usernumber = number
        db.session.commit()
        return redirect('/')

if __name__ == "__main__":
    app.run(debug = True,host='0.0.0.0',port=5000)

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

在这里插入图片描述

你可能感兴趣的:(Python,Web,Linux,flask,python,mysql,mysqldb,sqlalchemy)