翼度科技»论坛 编程开发 python 查看内容

轻量级Web框架Flask(二)

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
Flask-SQLAlchemy

MySQL是免费开源软件,大家可以自行搜索其官网(https://www.MySQL.com/downloads/)
测试MySQL是否安装成功
在所有程序中,找到MySQL→MySQL Server 5.6下面的命令行工具,然后单击输入密码后回车,就可以知道MySQL数据库是否链接成功。
右击桌面上的“计算机”,在弹出的快捷键菜单中选择“属性”|“高级系统设置”|“环境变量”,在path里面添加MySQL bin目录的路径。选择环境变量,在环境变量中的path路径下输入你的MySQL路径就行了。默认安装的路径是C:\MySQL\MySQL Server 5.6\bin
安装flask-sqlalchemy,安装不了就更换豆瓣源
  1. pip install flask-sqlalchemy
复制代码
 对象-关系映射实质
  1. class  Lib_card(db.Model):
  2.     __tablename__ = 'lib_card'
  3.     id = db.Column(db.Integer, primary_key=True, comment='id号')
  4.     card_id = db.Column(db.Integer, nullable=False, comment = '借书证')
  5.     book_id = db.Column(db.Integer, db.ForeignKey('book.id'))
  6.     books = db.relationship('Book', backref=db.backref('cards'),uselist=False)
复制代码
在Flask-SQLAlchemy中,插入、修改、删除操作均由数据库会话管理
需要一个配置config.py
  1. USERNAME= 'root'                                        #设置登录账号
  2. PASSWORD= '930103'                                        #设置登录密码
  3. HOST= '127.0.0.1'                                        #设置主机地址
  4. PORT= '3306'                                                #设置端口号
  5. DATABASE= 'demo1'                                #设置访问的数据库
  6. SQLALCHEMY_DATABASE_URI= f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}'#创建数据库连接示例
  7. #动态追踪修改设置,如未设置只会提示警告
  8. SQLALCHEMY_TRACK_MODIFICATIONS=False
  9. #查询时会显示原始SQL语句
  10. SQLALCHEMY_ECHO= True
复制代码
实例
  1. from datetime import datetimefrom flask import Flask                                                        #导入Flask模块from flask_sqlalchemy import SQLAlchemy               #导入SQLAlchemy模块import config                                                                 #导入配置文件app= Flask(__name__)                                                        #Flask初始化app.config.from_object(config)                                        #配置文件实例化#初始化一个对象db=SQLAlchemy(app)class Book(db.Model):    __tablename__ = 'book'    id = db.Column(db.Integer, primary_key = True,comment='id号')    title = db.Column(db.String(50), nullable=False,comment='书名')    publishing_office = db.Column(db.String(100), nullable=False,comment='出版社')    isbn = db.Column(db.String(100), nullable=False, comment='isbn号')    storage_time = db.Column(db.DateTime, default=datetime.now(), comment='入库时间')class  Lib_card(db.Model):
  2.     __tablename__ = 'lib_card'
  3.     id = db.Column(db.Integer, primary_key=True, comment='id号')
  4.     card_id = db.Column(db.Integer, nullable=False, comment = '借书证')
  5.     book_id = db.Column(db.Integer, db.ForeignKey('book.id'))
  6.     books = db.relationship('Book', backref=db.backref('cards'),uselist=False)with app.app_context():#测试数据库连接是否成功    db.create_all()     #创建数据库    # book1= Book(id=9,title='智能导论', publishing_office='高等教育出版社',isbn='9787040479844')    # db.session.add(book1)    # db.session.commit()    # result = Book.query.filter(Book.id == 9).first()    # print(result.title)    # agine = Book.query.filter(Book.title == result.title).all()    # for i in agine:    #     print(i.id)    # db.session.delete(result)    # db.session.commit()    # card1=Lib_card(card_id='18001', book_id='8')    # card2=Lib_card(card_id='18002', book_id='8')    # db.session.add(card1)    # db.session.add(card2)    # db.session.commit()    book_query = Book.query.filter(Book.id == 9).first()    lib_card_query = book_query.cards    for i in lib_card_query:        print(i.card_id)@app.route('/')def index():    return 'index'# if __name__== '__main__':#     app.run(debug=True)
复制代码
注意:一个表(模型)的定义必须要定义一个主键,这个主键一般为id。在定义了Lib_card类后,申明了一个外键,并且在relationship方法中使用uselist=False来约束其关系。book_id =db.Column(db.Integer,db.ForeignKey('book.id'))表示创建一个外键,类型要跟主表一样,通过db.ForeignKey("user.id")与主表绑定books =db.relationship('Book',backref=db.backref('cards');uselist=False)表示Book可以根据Lib_card中的借书证查找到book表中的信息,backref="cards"表示book表可以直接通过cards查找到该书下的借书证号码。
框架实例

建一个apps文件夹,添加一个admin包,admin包下创建三个py文件
  1. #__init__.py
  2. #预加载模块内容
  3. #其他地方调用的时候 可以直接from apps.admin import bp as admin_bp不用找到views
  4. from .views import bp
复制代码
  1. #forms.py
  2. from flask_wtf import FlaskForm
  3. from wtforms import *
  4. from wtforms.validators import *
  5. class NameForm(FlaskForm):
  6.     username = StringField('用户名',validators=[DataRequired()])
  7.     password = PasswordField('密码',validators=[DataRequired()])
  8.     submit = SubmitField('提交')
复制代码
  1. #models.py
  2. from exts import db
  3. class User(db.Model):
  4.     __tablename__ = 'jq_user'
  5.     uid = db.Column(db.Integer, primary_key=True)
  6.     username = db.Column(db.String(50), nullable=False, comment="用户名")
  7.     password = db.Column(db.String(100), nullable=False,comment="密码")
  8.     email = db.Column(db.String(50), nullable=False, unique=True, comment = "邮箱")
复制代码
  1. #views.py
  2. from flask import Blueprint, request, flash, render_template
  3. from apps.admin.forms import NameForm
  4. from apps.admin.models import User
  5. bp = Blueprint("admin",__name__)
  6. @bp.route("/admin",methods=['GET','POST'])
  7. def index():
  8.     form = NameForm()
  9.     if request.method == 'POST':
  10.         if form.validate_on_submit():
  11.             username = request.form.get('username')
  12.             password = request.form.get('password')
  13.             result = User.query.filter(User.username==username).first()
  14.             if result and password == result.password:
  15.                 flash('登录成功')
  16.             else:
  17.                 return render_template('login.html', form=form, errormsg="登陆失败")
  18.     return render_template('login.html', form=form)
复制代码
建一个文件夹templates,专门放login.html文件,通过render_template调用
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Title</title>
  6.     <h1>用户注册登录</h1>
  7.     <form method="post" action="/test/admin">
  8.         {{ form.csrf_token()}}
  9.         {{ form.username.label }}{{ form.username}}
  10.         {{ form.password.label }}{{ form.password}}
  11.         {{ form.submit }}{{errormsg}}
  12.         {% for message in get_flashed_messages() %}
  13.             {{ message }}
  14.         {% endfor %}
  15.     </form>
  16. </head>
  17. <body>
  18. </body>
  19. </html>
复制代码
建一个app.py
  1. from flask import Flask
  2. from apps.admin import bp as admin_bp
  3. from exts import db
  4. from apps.common import bp as common_bp
  5. from apps.front import bp as front_bp
  6. from apps.admin.models import User
  7. from apps.common.models import Book
  8. def create_app():
  9.     app = Flask(__name__)
  10.     app.secret_key = '123321'
  11.     #注册蓝图,注册时候可以设置前缀
  12.     app.register_blueprint(admin_bp,url_prefix="/test")
  13.     app.register_blueprint(common_bp)
  14.     app.register_blueprint(front_bp)
  15.     app.config.from_object('config')
  16.     # db.app = app
  17.     db.init_app(app)
  18.     return app
  19. if __name__ == '__main__':
  20.     app = create_app()
  21.     with app.app_context():
  22.         db.create_all()
  23.     app.run(host="127.0.0.1",port=1314,debug=True)
复制代码
建一个config.py
  1. DEBUG=TrueUSERNAME= 'root'                                        #设置登录账号
  2. PASSWORD= '930103'                                        #设置登录密码
  3. HOST= '127.0.0.1'                                        #设置主机地址
  4. PORT= '3306'                                                #设置端口号
  5. DATABASE= 'demo1'                                #设置访问的数据库
  6. SQLALCHEMY_DATABASE_URI= f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}'#创建数据库连接示例
  7. #动态追踪修改设置,如未设置只会提示警告
  8. SQLALCHEMY_TRACK_MODIFICATIONS=False
  9. #查询时会显示原始SQL语句
  10. SQLALCHEMY_ECHO= True
复制代码
建一个exts.py
  1. #encoding:utf-8
  2. from flask_sqlalchemy import SQLAlchemy
  3. db=SQLAlchemy()
复制代码
来源:https://www.cnblogs.com/yetangjian/p/17320268.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具