JAVA网络爬虫
HttpClient

导航

 
  1. 定义模型类

    	# coding:utf-8
    	
    	from flask import Flask, render_template, request, jsonify, redirect, url_for
    	from flask_sqlalchemy import SQLAlchemy
    	from flask_wtf import FlaskForm
    	from wtforms import StringField, SubmitField
    	from wtforms.validators import DataRequired
    	from flask_script import Manager
    	from flask_migrate import Migrate, MigrateCommand
    	
    	# 创建flask实例	
    	app = Flask(__name__)
    	
    	
    	class Config(object):
    	    # 设置连接数据库的URL
    	    SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1:3306/db_flask_python2_author_book'
    	    # 设置sqlalchemy自动跟踪数据库
    	    SQLALCHEMY_TRACK_MODIFICATIONS = True
    		# 随便取个字符窜值复制给它就ok了
    	    SECRET_KEY = "abcdef"
    	
    	
    	# 把这个类添加到app设置里
    	app.config.from_object(Config)
    	
    	# 创建数据库sqlalchemy工具对象 (SQLAlchemy会自动去config把Config里的属性提取出来)
    	db = SQLAlchemy(app)
    	
    	# 创建数据库迁移工具对象的步足有3步
    	# 1. 创建flask脚本管理工具对象
    	manager = Manager(app)
    	
    	# 2. 创建数据库迁移工具对象
    	Migrate(app, db)
    	
    	# 3. 向manager对象中添加数据库的操作命令
    	# 第一个参数是给这条命令取的名字叫什么,关于数据库的我们通常叫db
    	# 第二个参数就是具体的命令
    	manager.add_command("db", MigrateCommand)
    	
    	
    	# 定义数据库的模型
    	class Author(db.Model):
    	    """作者"""
    	    # 这是跟模型类取个在数据库中存在的表名, 在数据库中存在的表名为tbl_authors
    	    __tablename__ = "tbl_authors"
    	    # db.Column表示在表中真实存在的字段, db.integer int类型 primary_key设置为主键
    	    id = db.Column(db.Integer, primary_key=True)
    	    # db.String(64) varchar类型 unique唯一标识
    	    name = db.Column(db.String(64), unique=True)
    	    # 给Book模型类添加个字段author但是不存在数据表中, 用来简便查询
    	    books = db.relationship("Book", backref="author")
    	    email = db.Column(db.String(64))
    	    mobile = db.Column(db.String(64))
    	
    	
    	class Book(db.Model):
    	    """书籍"""
    	    __tablename__ = "tbl_book"
    	    id = db.Column(db.Integer, primary_key=True)
    	    name = db.Column(db.String(64), unique=True)
    	    # 外键设置那张表里面的那个字段
    	    # 这里跟django不同, django设置外键只需填模型类这个参数, 不需要字段
    	    # db.ForeignKey:外键
    	    author_id = db.Column(db.Integer, db.ForeignKey("tbl_authors.id"))
    	
    	
    	# 创建前端表单类
    	class AuthorBookForm(FlaskForm):
    	    """作者数据表单模型了"""
    	    # label:就是html标签里面的label标签
    	    # validators:就是html标签里面的input标签
    	    # DataRequired:确保字段中有数据
    	    author_name = StringField(label=u"作者", validators=[DataRequired(u"作者必填")])
    	    book_name = StringField(label=u"书籍", validators=[DataRequired(u"书籍必填")])
    	    submit = SubmitField(label=u"提交")
    	
    	
    	# post /dalete_book
    	# {"book_id":x}
    	# @app.route("/delete_book", methods=["post"])
    	# def delete_book():
    	#     """删除书籍"""
    	#     # 提取参数
    	#     # 如前端发送的请求体数据是json格式, get_json会解析成字典
    	#     # get_json要求前端传送的数据的Content-Type:application/json
    	#     req_dict = request.get_json()
    	#
    	#     # 这是传递的不是json数据时的写法
    	#     # req_dict = json.loads(request.data)
    	#
    	#     # 从字典中提取书本id
    	#     book_id = req_dict.get("book_id")
    	#
    	#     # 校验参数
    	#     try:
    	#         # 拿到的是一个对象
    	#         book = Book.query.get(book_id)
    	#     except Exception as e:
    	#         return jsonify(res=0, errmsg="no")
    	#
    	#     # 业务处理:删除数据
    	#     db.session.delete(book)
    	#     db.session.commit()
    	#
    	#     # 返回应答
    	#     # "Content-Type":"application/json"
    	#     return jsonify(res=1, message="ok")
    	
    	
    	# 用get请求方式
    	# /delete_book/book_id
    	# /delete_book?book_id
    	@app.route("/delete_book", methods=["GET"])
    	def delete_book():
    	    """删除书籍"""
    	    # 提取参数
    	    book_id = request.args.get("book_id")
    	
    	    # 校验参数
    	    try:
    	        # 拿到的是一个对象
    	        book = Book.query.get(book_id)
    	    except Exception as e:
    	        return redirect(url_for("index"))
    	
    	    # 删除
    	    db.session.delete(book)
    	    # 提交到数据库
    	    db.session.commit()
    	
    	    # 返回应答
    	    # "Content-Type":"application/json"
    	    return redirect(url_for("index"))
    	
    	
    	@app.route("/", methods=["GET","POST"])
    	def index():
    	    # 创建表单对象
    	    form = AuthorBookForm()
    	
    	    # 判断是是post还是get
    	    if form.validate_on_submit():
    	        # 验证表单成功
    	        # 提取数据是要有data
    	        author_name = form.author_name.data
    	        # 创建数据库对象
    	        author = Author()
    	        # 给数据库对象属性赋值
    	        author.name = author_name
    	        # 添加
    	        db.session.add(author)
    	        # 保存在数据库里
    	        db.session.commit()
    	
    	        # 同上
    	        book_name = form.book_name.data
    	        book = Book()
    	        book.name = book_name
    	        # 记住 这里有外件约束, 所以添加数据时, 你要把外件添加进去
    	        # 有外键的数据库, 添加方法也跟django不一样,
    	        # flask添加偏底层, 数据库怎么添加,flask怎么添加
    	        # django, 看到外键, 只要给对应的模型类的对象就行
    	        book.author_id = author.id
    	        # 添加
    	        db.session.add(book)
    	       # 提交到数据库
    	        db.session.commit()
    	
    	
    	    # 查询数据库 只需要查询作者模型了, 因为在这个模型类里面有个books
    	    # 查询Author里面的所有数据
    	    author_li = Author.query.all()
    	    return render_template("index.html", author_li=author_li, form=form)
    	
    	
    	if __name__ == '__main__':
    	    # # 初始化数据, 删除所有的表
    	    # db.drop_all()
    	    # # 创建所有的表
    	    # db.create_all()
    	    #
    	    # 生成数据
    	    # au_xi = Author(name='我吃西红柿')
    	    # au_qian = Author(name='萧潜')
    	    # au_san = Author(name='唐家三少')
    	    # 添加
    	    # db.session.add_all([au_xi, au_qian, au_san])
    	    # 提交到数据
    	    # db.session.commit()
    	    #
    	    # 给 Book添加数据
    	    # bk_xi = Book(name='吞噬星空', author_id=au_xi.id)
    	    # bk_xi2 = Book(name='寸芒', author_id=au_xi.id)
    	    # bk_qian = Book(name='飘渺之旅',author_id=au_qian.id)
    	    # bk_san = Book(name='冰火魔厨', author_id=au_san.id)
    	    # 添加
    	    # db.session.add_all([bk_xi, bk_xi2, bk_qian, bk_san])
    	    # 提交到数据
    	    # db.session.commit()
    	    # app.run(debug=True)
    	
    	    # 通过manager对象启动程序		    
    	    manager.run()
    
  2. 用manager.run() 启动时用:python py文件名 -h ip:port

  3. 数据库迁移命令

    	# flast里面的初始化(db init)db是你在py文件里取得名字
    	python author_book.py db init
    	
    	# flask里面生成数据库迁移文件的命令(db migrate)相当于django的makemigations
    	python author_book.py db migrate
    	python author_book.py db migrate -m 'add mobile' # -m 'add mobile' 是给生成出来的迁移文件名字 添加add mobile
    	
    	
    	# flask里面往数据库里面写数据的命令(db upgrade)相当于django的migrate
    	python author_book.py db upgrade
    	
    	
    	# flask里面查看数据库执行了那些命令(防止生成迁移后, 后悔)history查看历史命令
    	python author_book.py db history
    	
    	# flask里面查看数据库执行了那些命令(防止生成迁移后, 后悔), downgrade(降级操作) 会退到fec14dc14de2
    	# 记住这里必须先执行history, 要不然你不知到会退到那个状态
    	python author_book.py db downgrade fec14dc14de2
    
posted on 2019-05-31 23:15  gmlgxx  阅读(47)  评论(0)    收藏  举报