1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)

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

时间:2024-05-21 03:55:51

相关推荐

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

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

🎈【Web开发】Python实现Web服务器(Flask快速入门)🎈🎈【Web开发】Python实现Web服务器(Flask案例测试)🎈🎈【Web开发】Python实现Web服务器(Flask部署上线)🎈🎈【Web开发】Python实现Web服务器(Flask+Tornado+nginx)🎈🎈【Web开发】Python实现Web服务器(Ubuntu下安装Flask)🎈🎈【Web开发】Python实现Web服务器(Ubuntu下打包Flask)🎈🎈【Web开发】Python实现Web服务器(Ubuntu下调试Flask)🎈🎈【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL)🎈

文章目录

1、简介2、安装2.1 安装MySQL数据库2.2 安装python2.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 #更新软件源

Ubuntu20.04中执行上述操作默认安装的mysql是8.0.21版本的。

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

想要验证 MySQL 服务器正在运行,输入:

sudo systemctl status mysql# orsudo systemctl status mysql.service

输入mysql --version可查询当前使用的mysql的版本;

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

mysql --version

使用mysql默认安装完成就启动了mysql。若无法启动,执行以下命令以启动MySQL服务器:

service mysql start# orsudo 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/f

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/f文件:

vim /etc/mysql/f

找到bind-address = 127.0.0.1这一行,大概在47行,我们将它注释掉。

重启mysql服务,使配置生效:

/etc/init.d/mysql restart

展示所有数据库:

mysql -hlocalhost -uroot -p#或者mysql -u root -pshow databases;

创建数据库:

create database flask_db;use flask_db;

2.2 安装python

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

sudo apt updatesudo apt install software-properties-commonsudo add-apt-repository ppa:deadsnakes/ppasudo apt install python3.9python3.9 --version

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

sudo apt updatesudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-devwget /ftp/python/3.9.0/Python-3.9.0.tgzcd Python-3.9.0./configure --enable-optimizationsmake -j 12sudo make altinstallpython3.9 --versionwhich python3.9sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1sudo apt install python3-aptcd /usr/lib/python3/dist-packagessudo cp apt_pkg.cpython-38-x86_64-linux-gnu.so apt_pkg.cpython-39-x86_64-linux-gnu.soln -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@# @Time : /12/25from 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, ForeignKeyfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy.orm import sessionmakerfrom sqlalchemy.orm import scoped_sessionengine = 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])mit()

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-devsudo apt-get install libmysqlclient-dev

再尝试安装flask-mysqldb:

3、代码测试

3.1 测试一

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

编写测试脚本如下:

demo1225.py

from flask import Flaskfrom flask_mysqldb import MySQLapp = Flask(__name__)# Requiredapp.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-attributesmysql = 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 osclass 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_URISQLALCHEMY_TRACK_MODIFICATIONS=TrueSQLALCHEMY_COMMIT_ON_TEARDOWN=TrueSQLALCHEMY_ECHO=True

demo1225_6.py

from flask import Flaskfrom flask_sqlalchemy import SQLAlchemyfrom config import Configapp = Flask(__name__)app.config.from_object(Config)db = SQLAlchemy(app)ROLE_USER = 0ROLE_ADMIN = 1class 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):returnwith app.app_context():db.drop_all()db.create_all()if __name__ == '__main__':user1 = Student(nickname='aaa', emial='456@')user2 = Student(nickname='bbb', emial='123@')with app.app_context():db.session.add_all([user1, user2]) mit()

3.3 测试三

demo1225_7.py

from flask import Flaskfrom flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)#设置连接数据库的URLapp.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@127.0.0.1:3306/flask_db'#设置每次请求结束后会自动提交数据库中的改动app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = Trueapp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True#查询时会显示原始SQL语句app.config['SQLALCHEMY_ECHO'] = Truedb = 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])mit()us1 = User(name='apple',email='aaa@',pswd='123456',role_id=ro1.id)us2 = User(name='pear',email='bbb@',pswd='abcded',role_id=ro2.id)us3 = User(name='banana',email='ccc@',pswd='1225',role_id=ro2.id)us4 = User(name='lemon',email='ddd@',pswd='=-123abc',role_id=ro1.id)db.session.add_all([us1,us2,us3,us4])mit()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(''))).all()# 逻辑或,需要导入or_from sqlalchemy import or_User.query.filter(or_(User.name!='apple',User.email.endswith(''))).all()#查询数据后删除user = User.query.first()db.session.delete(user)mit()User.query.all()#更新数据user = User.query.first()user.name = 'tree'mit()User.query.first()#使用updateUser.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,redirectfrom flask_sqlalchemy import SQLAlchemyapp = 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)mit()#添加完成重定向至主页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)mit()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 = provincecity.cityname = citynamecity.usernumber = mit()return redirect('/')if __name__ == "__main__":app.run(debug = True,host='0.0.0.0',port=5000)

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭

如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???

如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)

感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。