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. 使用idea从零编写SpringCloud项目-Feign

    ps:Fegin和Ribbon 其实是差不多的东西,Fegin里面也是集成了Ribbon,不过咱们写代码不是要优雅嘛,使用Feign就会优雅很多了,看着比直接使用Ribbon舒坦一点 就不重新构建项目 ...

  2. Java新手问题 请问各路大佬这是什么问题导致的呢?

  3. 探秘ThreadLocal

    一 类结构 主要是set(T), get(), remove()方法 二  TheadLocal是什么时候创建的 threadLocal的初始化, lazy creating, 用到的时候(get 或 ...

  4. 切片slice

    1.切片 切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用类型的机制 切片的使用和数组类似,如遍历切片,访问切片的元素和求切片长度len(slice)都一样. 切片的长度是可以变化的, ...

  5. HTML笔记(二) HTML标签元素

    一 常用的头部元素标签 <head>元素包含了所有的头部标签元素. 1.<title> <title>标签定义了HTML文档的标题,在HTML/XHTML文档中是必 ...

  6. scala apply方法和update方法

    示例代码1 class TestApplyClass { def apply(param: String): String = { println("apply method called, ...

  7. CUDA基础2

    二. 1.指令调度,对于多条指令怎样调度让他们运行更快. 对于有冲突的两条指令,采用寄存器重命名技术. 2.指令重排  乱序执行,为了获取最大的吞吐率.  增大功耗 增加芯片面积. 3.缓存,容量越大 ...

  8. vsftpd配置FTP服务器(Centos7.x安装)

    安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | grep vsftpdvsftpd-2.2.2-24.el6.x86_64 如果有展示则已经安装,不需要重新安装 ...

  9. JavaWeb学习笔记第二弹

    (续集)DQL:查询操作 1.排序查询 排序方式:(仅有一个排序参照时) 1.升序:ASC(默认) 命令:**select * from 表名 order by 列名 (asc);** 2.降序:DE ...

  10. Masa Framework源码解读-02缓存模块(分布式缓存进阶之多级缓存)

    序言 ​ 今天这篇文章来看看Masa Framework的缓存设计,上一篇文章中说到的MasaFactory的应用也会在这章节出现.文章中如有错误之处还请指点,咱们话不多说,直入主题. Masa Fr ...