🍺基于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 安装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 #更新软件源
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???
如果您需要相关功能的代码定制化开发,可以留言私信作者;
(✿◡‿◡)
感谢各位大佬童鞋们的支持!
( ´ ▽´ )ノ ( ´ ▽´)っ!!!