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

16 篇文章 0 订阅
6 篇文章 0 订阅

在这里插入图片描述

🍺基于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、简介

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

2、安装

2.1 安装MySQL数据库

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

sudo apt-get update  #更新软件源

在这里插入图片描述
Ubuntu20.04中执行上述操作默认安装的mysql是8.0.21版本的。

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

在这里插入图片描述在这里插入图片描述
想要验证 MySQL 服务器正在运行,输入:

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

在这里插入图片描述

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

mysql --version

在这里插入图片描述
使用mysql默认安装完成就启动了mysql。若无法启动,执行以下命令以启动MySQL服务器:

service mysql start
# or
sudo systemctl start mysql

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

sudo netstat -tap | grep mysql

在这里插入图片描述
进入mysql shell界面:

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

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

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

在这里插入图片描述

mysql -u debian-sys-maint -p Y08nwjHjazy2mS3e

在这里插入图片描述

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

sudo mysql

在这里插入图片描述

为了提高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;

在这里插入图片描述
第二个选项,推荐的选项,就是创建一个新的独立管理用户,拥有所有数据库的访问权限:

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

在这里插入图片描述
重新用新用户名登陆试试:

mysql -u tomcat -p

在这里插入图片描述
开放远程登录权限:
首先确认3306端口是否对外开放,mysql默认状态下是不开放对外访问功能的。查看方法如下:

netstat -an | grep 3306

在这里插入图片描述
从上面可以看出,mysql的3306端口只是监听本地连接127.0.0.1。我们做下修改,使其对外其他地址开放。
打开/etc/mysql/my.cnf文件:

vim /etc/mysql/my.cnf

找到bind-address = 127.0.0.1这一行,大概在47行,我们将它注释掉。
在这里插入图片描述
重启mysql服务,使配置生效:

/etc/init.d/mysql restart

在这里插入图片描述

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

show databases;

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

2.5 安装pymysql库

pip install pymysql
  • demo1225_3.py:
# -*- coding: utf-8 -*-
# @File  : demo1225_3.py
# @author: tomcat
# @email : tomcat@163.com
# @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)

在这里插入图片描述

  • 主动创建映射: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()

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

pip install pymysql

在这里插入图片描述
仍然安装失败,可能是因为没有安装libmysqld-dev和libmysqlclient-dev两个包:

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

在这里插入图片描述
再尝试安装flask-mysqldb:
在这里插入图片描述

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)

在这里插入图片描述

在这里插入图片描述

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='456@163.com')
    user2 = Student(nickname='bbb', emial='123@126.com')

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

在这里插入图片描述

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:123456@127.0.0.1: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='aaa@163.com',pswd='123456',role_id=ro1.id)
        us2 = User(name='pear',email='bbb@189.com',pswd='abcded',role_id=ro2.id)
        us3 = User(name='banana',email='ccc@126.com',pswd='20221225',role_id=ro2.id)
        us4 = User(name='lemon',email='ddd@163.com',pswd='=-123abc',role_id=ro1.id)
        db.session.add_all([us1,us2,us3,us4])
        db.session.commit()
    
    app.run(debug=True)

在这里插入图片描述

# 返回名字等于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:123456@127.0.0.1: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???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

在这里插入图片描述

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
好的,我可以为你提供一些指导。 1. 安装必要的库 在Ubuntu下,你需要安装PythonMySQL客户端库和Flask库。可以通过以下命令来安装这些库: ``` sudo apt-get install python-dev default-libmysqlclient-dev build-essential pip install flask flask-mysqldb ``` 2. 连接数据库Python中连接MySQL数据库,可以使用MySQLdb或者PyMySQL库。这里我们以MySQLdb为例,在Python代码中添加以下代码: ``` import MySQLdb db = MySQLdb.connect(host="localhost", user="root", passwd="password", db="database_name") cursor = db.cursor() ``` 其中,`host`指数据库服务器地址,`user`指连接数据库的用户名,`passwd`指连接数据库的密码,`db`指连接的数据库名。使用`db.cursor()`创建一个游标对象,用于执行SQL语句。 3. 实现增删查改 使用Flask框架,可以实现简单的增删查改功能。在Python代码中添加以下路由和函数: ``` from flask import Flask, render_template, request app = Flask(__name__) @app.route('/') def home(): return render_template('home.html') @app.route('/add', methods=['POST']) def add(): if request.method == 'POST': name = request.form['name'] age = request.form['age'] cursor.execute("INSERT INTO students (name, age) VALUES (%s, %s)", (name, age)) db.commit() return "Record added successfully" @app.route('/delete', methods=['POST']) def delete(): if request.method == 'POST': id = request.form['id'] cursor.execute("DELETE FROM students WHERE id = %s", (id,)) db.commit() return "Record deleted successfully" @app.route('/update', methods=['POST']) def update(): if request.method == 'POST': id = request.form['id'] name = request.form['name'] age = request.form['age'] cursor.execute("UPDATE students SET name=%s, age=%s WHERE id=%s", (name, age, id)) db.commit() return "Record updated successfully" @app.route('/search', methods=['POST']) def search(): if request.method == 'POST': name = request.form['name'] cursor.execute("SELECT * FROM students WHERE name = %s", (name,)) results = cursor.fetchall() return render_template('search_results.html', results=results) if __name__ == '__main__': app.run(debug=True) ``` 其中,`home()`函数渲染`home.html`模板,该模板中包含了一个表单,用于输入添加、删除、更新和查询数据的信息。`add()`函数用于添加数据,`delete()`函数用于删除数据,`update()`函数用于更新数据,`search()`函数用于查询数据。 4. 编写HTML模板 在Flask中,HTML模板使用Jinja2模板引擎。在项目目录下,创建`templates`目录,并在该目录下创建`home.html`和`search_results.html`两个文件。`home.html`模板中包含表单,用于输入增删查改的信息。`search_results.html`模板用于展示查询结果。 `home.html`模板代码如下: ``` <!DOCTYPE html> <html> <head> <title>Flask MySQL Example</title> </head> <body> <h1>Flask MySQL Example</h1> <form action="{{ url_for('add') }}" method="post"> <label for="name">Name:</label> <input type="text" name="name" id="name"> <label for="age">Age:</label> <input type="text" name="age" id="age"> <input type="submit" value="Add"> </form> <form action="{{ url_for('delete') }}" method="post"> <label for="id">ID:</label> <input type="text" name="id" id="id"> <input type="submit" value="Delete"> </form> <form action="{{ url_for('update') }}" method="post"> <label for="id">ID:</label> <input type="text" name="id" id="id"> <label for="name">Name:</label> <input type="text" name="name" id="name"> <label for="age">Age:</label> <input type="text" name="age" id="age"> <input type="submit" value="Update"> </form> <form action="{{ url_for('search') }}" method="post"> <label for="name">Name:</label> <input type="text" name="name" id="name"> <input type="submit" value="Search"> </form> </body> </html> ``` `search_results.html`模板代码如下: ``` <!DOCTYPE html> <html> <head> <title>Search Results</title> </head> <body> <h1>Search Results</h1> {% if results %} <table> <tr> <th>ID</th> <th>Name</th> <th>Age</th> </tr> {% for result in results %} <tr> <td>{{ result[0] }}</td> <td>{{ result[1] }}</td> <td>{{ result[2] }}</td> </tr> {% endfor %} </table> {% else %} <p>No results found.</p> {% endif %} </body> </html> ``` 5. 运行项目 在终端中进入项目目录,运行以下命令: ``` export FLASK_APP=app.py export FLASK_ENV=development flask run ``` 然后在浏览器中访问`http://localhost:5000/`,即可看到表单页面。 注意:在实际应用中,需要根据具体情况修改代码中的数据库连接信息和表名等参数。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值