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,安装不了就更换豆瓣源

pip install flask-sqlalchemy

 对象-关系映射实质

class  Lib_card(db.Model):
__tablename__ = 'lib_card'
id = db.Column(db.Integer, primary_key=True, comment='id号')
card_id = db.Column(db.Integer, nullable=False, comment = '借书证')
book_id = db.Column(db.Integer, db.ForeignKey('book.id'))
books = db.relationship('Book', backref=db.backref('cards'),uselist=False)

在Flask-SQLAlchemy中,插入、修改、删除操作均由数据库会话管理

需要一个配置config.py

USERNAME= 'root'                                        #设置登录账号
PASSWORD= '930103' #设置登录密码
HOST= '127.0.0.1' #设置主机地址
PORT= '3306' #设置端口号
DATABASE= 'demo1' #设置访问的数据库
SQLALCHEMY_DATABASE_URI= f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}'#创建数据库连接示例
#动态追踪修改设置,如未设置只会提示警告
SQLALCHEMY_TRACK_MODIFICATIONS=False
#查询时会显示原始SQL语句
SQLALCHEMY_ECHO= True

实例

from datetime import datetime

from 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):
__tablename__ = 'lib_card'
id = db.Column(db.Integer, primary_key=True, comment='id号')
card_id = db.Column(db.Integer, nullable=False, comment = '借书证')
book_id = db.Column(db.Integer, db.ForeignKey('book.id'))
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文件

#__init__.py
#预加载模块内容
#其他地方调用的时候 可以直接from apps.admin import bp as admin_bp不用找到views
from .views import bp
#forms.py
from flask_wtf import FlaskForm
from wtforms import *
from wtforms.validators import * class NameForm(FlaskForm):
username = StringField('用户名',validators=[DataRequired()])
password = PasswordField('密码',validators=[DataRequired()])
submit = SubmitField('提交')
#models.py
from exts import db class User(db.Model):
__tablename__ = 'jq_user'
uid = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(50), nullable=False, comment="用户名")
password = db.Column(db.String(100), nullable=False,comment="密码")
email = db.Column(db.String(50), nullable=False, unique=True, comment = "邮箱")
#views.py
from flask import Blueprint, request, flash, render_template
from apps.admin.forms import NameForm
from apps.admin.models import User bp = Blueprint("admin",__name__) @bp.route("/admin",methods=['GET','POST'])
def index():
form = NameForm()
if request.method == 'POST':
if form.validate_on_submit():
username = request.form.get('username')
password = request.form.get('password')
result = User.query.filter(User.username==username).first()
if result and password == result.password:
flash('登录成功')
else:
return render_template('login.html', form=form, errormsg="登陆失败")
return render_template('login.html', form=form)

建一个文件夹templates,专门放login.html文件,通过render_template调用

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<h1>用户注册登录</h1>
<form method="post" action="/test/admin">
{{ form.csrf_token()}}
{{ form.username.label }}{{ form.username}}
{{ form.password.label }}{{ form.password}}
{{ form.submit }}{{errormsg}} {% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
</form>
</head>
<body> </body>
</html>

建一个app.py

from flask import Flask
from apps.admin import bp as admin_bp
from exts import db
from apps.common import bp as common_bp
from apps.front import bp as front_bp
from apps.admin.models import User
from apps.common.models import Book def create_app():
app = Flask(__name__)
app.secret_key = '123321'
#注册蓝图,注册时候可以设置前缀
app.register_blueprint(admin_bp,url_prefix="/test")
app.register_blueprint(common_bp)
app.register_blueprint(front_bp)
app.config.from_object('config')
# db.app = app
db.init_app(app)
return app if __name__ == '__main__':
app = create_app()
with app.app_context():
db.create_all()
app.run(host="127.0.0.1",port=1314,debug=True)

建一个config.py

DEBUG=True
USERNAME= 'root' #设置登录账号
PASSWORD= '930103' #设置登录密码
HOST= '127.0.0.1' #设置主机地址
PORT= '3306' #设置端口号
DATABASE= 'demo1' #设置访问的数据库
SQLALCHEMY_DATABASE_URI= f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}'#创建数据库连接示例
#动态追踪修改设置,如未设置只会提示警告
SQLALCHEMY_TRACK_MODIFICATIONS=False
#查询时会显示原始SQL语句
SQLALCHEMY_ECHO= True

建一个exts.py

#encoding:utf-8
from flask_sqlalchemy import SQLAlchemy
db=SQLAlchemy()

轻量级Web框架Flask(二)的更多相关文章

  1. 轻量级Web框架Flask——Web表单

    安装 Flask-WTF及其依赖可使用pip安装 pip install flask_wtf 配置 要求应用配置一个密钥.密钥是一个由随机字符构成的唯一字符串,通过加密或签名以不同的方式提升应用的安全 ...

  2. 用Python手把手教你搭建一个web框架-flask微框架!

    在之前的文章当中,小编已经教过大家怎么搭建一个Django框架,今天我们来探索另外的一种框架的搭建,这个框架就是web框架-flask微框架啦!首先我们带着以下的几个问题来阅读本文: 1.flask是 ...

  3. python几个轻量级web框架

    python几个轻量级web框架 2016-04-11 18:04:34 惹不起的程咬金 阅读数 7944更多 分类专栏: 云计算/大数据/并行计算 Python   我最近发表了一篇名为 ‘7 Mi ...

  4. 快速上手python的简单web框架flask

    目录 简介 web框架的重要组成部分 快速上手flask flask的第一个应用 flask中的路由 不同的http方法 静态文件 使用模板 总结 简介 python可以做很多事情,虽然它的强项在于进 ...

  5. 「造个轮子」——cicada(轻量级 WEB 框架)

    前言 俗话说 「不要重复造轮子」,关于是否有必要不再本次讨论范围. 创建这个项目的主要目的还是提升自己,看看和知名类开源项目的差距以及学习优秀的开源方式. 好了,现在着重来谈谈 cicada 这个项目 ...

  6. python web框架Flask——csrf攻击

    CSRF是什么? (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click ...

  7. Python超级明星WEB框架Flask

    Flask简介 Flask是一个相对于Django而言轻量级的Web框架. 和Django大包大揽不同,Flask建立于一系列的开源软件包之上,这其中 最主要的是WSGI应用开发库Werkzeug和模 ...

  8. Python web框架 flask

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  9. web框架-(二)Django基础

    上面我们已经知道Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Sessi ...

  10. 【Flask】微型web框架flask大概介绍

    Flask Flask是一个基于python的,微型web框架.之所以被称为微型是因为其核心非常简单,同时具有很强的扩展能力.它几乎不给使用者做任何技术决定. 安装flask时应该注意其必须的几个支持 ...

随机推荐

  1. Spring Boot中编写单元测试

    编写单元测试可以帮助开发人员编写高质量的代码,提升代码质量,减少Bug,便于重构.Spring Boot提供了一些实用程序和注解,用来帮助我们测试应用程序,在Spring Boot中开启单元测试只需引 ...

  2. 用shell开火车哈哈

    用shell开火车!(σ゚∀゚)σ⁶⁶⁶⁶⁶⁶⁶⁶⁶⁶ while true; do sl -aFile; done 这个效果更佳

  3. nodejs批量重命名

    const fs = require("fs"); // directory path let config = {   affix: null,   src: null, }; ...

  4. RabbitMQ身份验证、授权、访问控制

    原文:https://www.rabbitmq.com/access-control.html 概述 不同的用户只能访问特定的虚拟主机.他们在每个虚拟主机中的权限也可以被限制. RabbitMQ支持两 ...

  5. jooq简单使用

    DSLContext首先简单的配置文件 <?xml version="1.0" encoding="UTF-8" standalone="yes ...

  6. HTML5的语义标签

    H5新增了很多标签,也更加语义化了,但是除了header.footer.nav等,其他的还真的没有去了解过,今天整理一下H5新增的语义化标签. Header: 不用多说,就是定义头部,可以多个. Fo ...

  7. ASP.NET的MVC模式中分布页和布局页的使用

    大概描述一下,分布页是布局页的一部分,分布页就相当于小图标,布局页就相当于PPT模板,PPT模板可以加入一些小图标(分布页),你只需要改改内容就好,视图创建的时候要选择包含布局页的 首先,去Contr ...

  8. Qt打包win应用的流程(转载)

    基本就是命令:windeployqt  目标文件.exe 一定要新开一个文件夹再执行这个命令. 参考网站: https://blog.csdn.net/weixin_39504048/article/ ...

  9. linux 修改文件内容命令

    1.进入文件:vim 文件名 eg #vim /etc/httpd/httpd.conf 2.查找待修改内容位置 : (1)shift+":",使文件变成可查询状态 (2)输入 / ...

  10. GRAPH ATTENTION NETWORKS(GAT)图注意力网络

    摘要: 我们提出一个图注意力网络,一个新的用来操作图结构数据的神经网络结构,它利用"蒙面"的自我注意力层来解决基于图卷积以及和它类似结构的短板.通过堆叠一些层,这些层的节点能够参与 ...