本文共 11288 字,大约阅读时间需要 37 分钟。
已上线演示地址:
项目源码地址:微电影网站:
前台模块:
后台
前台后台表单处理,模板目录独立。数据模型共有。
前后台目录分析:
pythonpackage:
python file:
directory:
最终项目目录如下图:
一个应用中或跨应用制作应用组件和支持通用的模式
为了有效的将前台和后台的模块进行区分与关联使用蓝图进行统一的规划。
将项目合理规划,易于扩展,维护。
app/admin/__init__.py
)from flask import Blueprint# 传入两个参数,一个是蓝图名称,一个是name值admin = Blueprint("admin",__name__)import views
app/__init__.py
)# 从前台,后台模块中导入我们的蓝图对象from admin import admin as admin_blueprint# 使用app对象,调用register_blueprint函数进行蓝图的注册# 第一个参数是蓝图,第二个参数是url地址的前缀。通过地址前缀划分前后台的路由app.register_blueprint(admin_blueprint,url_prefix="admin")
app/admin/views.py
)# 从模块的初始化文件中导入蓝图。from . import admin# 路由定义使用装饰器进行定义@admin.route("/")
home/init.py:
from flask import Blueprinthome = Blueprint("home",__name__)import app.home.views
admin/init.py:
from flask import Blueprintadmin = Blueprint("admin",__name__)import app.admin.views
home/views.py:
from . import home@home.route("/")def index(): return "this is home
"
admin/views.py:
from . import admin@admin.route("/")def index(): return "this is admin
"
app/init.py:
# _*_ coding: utf-8 _*___author__ = 'mtianyan'__date__ = '2017/8/26 17:05'from flask import Flaskapp = Flask(__name__)app.debug = Truefrom app.home import home as home_blueprintfrom app.admin import admin as admin_blueprintapp.register_blueprint(home_blueprint)app.register_blueprint(admin_blueprint, url_prefix="/admin")
前台不需要加前缀,并为admin设置了url前缀"/admin"
manage.py:
# _*_ coding: utf-8 _*___author__ = 'mtianyan'__date__ = '2017/8/26 17:05'from app import appif __name__ == "__main__": app.run()
成果:
点击run之后可以在浏览器里看到:
前台绿色,后台(/admin)红色
使用flaskSQLAlchemy定义和业务需求相关的数据库模型
pip install flask-sqlalchemy
sqlalchemy(企业级的orm对象关系映射框架。面向对象的思想操作数据库)
from flask_sqlalchemy import SQLAlchemyfrom flask import Flaskapp = from flask import Flask app = Flask(__name__)app.config['SQLALCHEMY_DATABASE_URL'] = "mysql://root:ty158917@localhost/movie"app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] =Truedb = SQLAlchemy(app)
class User(db.Model): # 数据库中数据表的名称 __tablename__ = "user" id = db.Column(db.Integer,primary_key=True) name = db.Column(db.String) pwd = db.Column(db.String) email = db.Column(db.String) phone = db.Column(db.String) info = db.Column(db.Text) face = db.Column(db.String) addtime = db.Column(db.DateTime,index=True,default=datetime.now) uuid = db.Column(db.String)
mysql -uroot -p密码
进入mysql控制台create database movie;
来创建数据库models.py:
Flask-SQLAlchemy 配置键参数查询地址
# _*_ coding: utf-8 _*_import datetime__author__ = 'mtianyan'__date__ = '2017/8/26 17:05'from flask import Flaskfrom flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)# 用于连接数据的数据库。app.config['SQLALCHEMY_DATABASE_URL'] = "mysql://root:root@127.0.0.1:3306/movie"# 如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] =Truedb = SQLAlchemy(app)# 会员数据模型class User(db.Model): __tablename__ = "user" id = db.Column(db.Integer, primary_key=True) # 编号 name = db.Column(db.String(100), unique=True) # 昵称 pwd = db.Column(db.String(100)) # 密码 email = db.Column(db.String(100), unique=True) # 邮箱 phone = db.Column(db.String(11), unique=True) # 手机号 info = db.Column(db.Text) # 个性简介 face = db.Column(db.String(255), unique=True) # 头像 addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 注册时间 uuid = db.Column(db.String(255), unique=True) # 唯一标识符 # (下面是设置外键的第二步,指向Userlog模型,进行一个互相关系的绑定) userlogs = db.relationship('Userlog', backref='user') # 会员日志外键关系关联 comments = db.relationship('Comment', backref='user') # 评论外键关系关联 moviecols = db.relationship('Moviecol', backref='user') # 收藏外键关系关联 def __repr__(self): return '' % self.name# 会员登录日志class Userlog(db.Model): __tablename__ = "userlog" id = db.Column(db.Integer, primary_key=True) # 编号 # (下面是设置外键的第一步):指向user表的id字段 user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 所属会员 ip = db.Column(db.String(100)) # ip地址 addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 登录时间 def __repr__(self): return ' ' % self.id
注意设置外键分为两步进行。
定义标签数据模型:
- id:编号- name:标题- movies:电影外键关联- addtime:创建时间
# 标签class Tag(db.Model): __tablename__ = "tag" id = db.Column(db.Integer, primary_key=True) # 编号 name = db.Column(db.String(100), unique=True) # 标题 addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加电影时间 # (设置外键的第二步)关联模型,相互关系 movies = db.relationship("Movie", backref='tag') # 电影外键关系关联 def __repr__(self): return "" % self.name# 电影class Movie(db.Model): __tablename__ = "movie" id = db.Column(db.Integer, primary_key=True) # 编号 title = db.Column(db.String(255), unique=True) # 标题 url = db.Column(db.String(255), unique=True) # 地址 info = db.Column(db.Text) # 电影简介 logo = db.Column(db.String(255), unique=True) # 封面 star = db.Column(db.SmallInteger) # 星级 playnum = db.Column(db.BigInteger) # 播放量 commentnum = db.Column(db.BigInteger) # 评论量 # (设置外键第一步) tag_id = db.Column(db.Integer, db.ForeignKey('tag.id')) # 所属标签 area = db.Column(db.String(255)) # 上映地区 release_time = db.Column(db.Date) # 上映时间 length = db.Column(db.String(100)) # 播放时间 addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 comments = db.relationship("Comment", backref='movie') # 评论外键关系关联 moviecols = db.relationship("Moviecol", backref='movie') # 收藏外键关系关联 def __repr__(self): return " " % self.title# 上映预告class Preview(db.Model): __tablename__ = "preview" id = db.Column(db.Integer, primary_key=True) # 编号 title = db.Column(db.String(255), unique=True) # 标题 logo = db.Column(db.String(255), unique=True) # 封面 addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 def __repr__(self): return " " % self.title
定义评论数据模型:
定义收藏电影数据模型;
# 评论class Comment(db.Model): __tablename__ = "comment" id = db.Column(db.Integer, primary_key=True) # 编号 content = db.Column(db.Text) # 评论内容 # 关联外键第一步,还要去user表和movie表进行第二步 movie_id = db.Column(db.Integer, db.ForeignKey('movie.id')) # 所属电影 user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 所属用户 addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 def __repr__(self): return "" % self.id# 电影收藏class Moviecol(db.Model): __tablename__ = "moviecol" id = db.Column(db.Integer, primary_key=True) # 编号 # 关联外键第一步,还要去user表和movie表进行第二步 movie_id = db.Column(db.Integer, db.ForeignKey('movie.id')) # 所属电影 user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 所属用户 addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 def __repr__(self): return " " % self.id
定义权限数据模型:
如果路由地址和权限地址匹配说明我们的管理员有这个权限。
定义角色模型:
# 权限class Auth(db.Model): __tablename__ = "auth" id = db.Column(db.Integer, primary_key=True) # 编号 name = db.Column(db.String(100), unique=True) # 名称 url = db.Column(db.String(255), unique=True) # 地址 addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 def __repr__(self): return "" % self.name# 角色class Role(db.Model): __tablename__ = "role" id = db.Column(db.Integer, primary_key=True) # 编号 name = db.Column(db.String(100), unique=True) # 名称 auths = db.Column(db.String(600)) # 角色权限列表 addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 admins = db.relationship("Admin", backref='role') # 管理员外键关系关联 def __repr__(self): return " " % self.name
# 管理员class Admin(db.Model): __tablename__ = "admin" id = db.Column(db.Integer, primary_key=True) # 编号 name = db.Column(db.String(100), unique=True) # 管理员账号 pwd = db.Column(db.String(100)) # 管理员密码 is_super = db.Column(db.SmallInteger) # 是否为超级管理员,0为超级管理员 role_id = db.Column(db.Integer, db.ForeignKey('role.id')) # 所属角色 addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 adminlogs = db.relationship("Adminlog", backref='admin') # 管理员登录日志外键关系关联 oplogs = db.relationship("Oplog", backref='admin') # 管理员操作日志外键关系关联 def __repr__(self): return "" % self.name def check_pwd(self, pwd): from werkzeug.security import check_password_hash return check_password_hash(self.pwd, pwd)# 管理员登录日志class Adminlog(db.Model): __tablename__ = "adminlog" id = db.Column(db.Integer, primary_key=True) # 编号 admin_id = db.Column(db.Integer, db.ForeignKey('admin.id')) # 所属管理员 ip = db.Column(db.String(100)) # 登录IP addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 登录时间 def __repr__(self): return " " % self.id# 操作日志class Oplog(db.Model): __tablename__ = "oplog" id = db.Column(db.Integer, primary_key=True) # 编号 admin_id = db.Column(db.Integer, db.ForeignKey('admin.id')) # 所属管理员 ip = db.Column(db.String(100)) # 操作IP reason = db.Column(db.String(600)) # 操作原因 addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 登录时间 def __repr__(self): return " " % self.id
pymysql
然后点击run运行。故障提示:
SQLAlchemy插入数据产生警告
cursors.py:166: Warning: (1366, "Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...' for column 'VARIABLE_VALUE' at row 479")result = self._query(query)
windows系统默认使用的是gbk的字符集,而我在windows系统上使用的数据库也是在本机windows系统上,而报错是因为字符集的问题,但是我指定了数据库的字符集是utf8的,然每次连接依然有这个错误,个人分析应该是系统字符串造成的。所以我改到使用linux系统里的mysql建立一个utf8的数据库后,使用未出现上述问题,所以分析应该是系统字符串导致的。
此处我使用了远程连接linux服务器上的数据库,消除了警告。但是即使你没有linux上的数据库也不影响,因为这只是一个警告,并不是错误。
完整models.py代码地址:
最终映射成功后的数据表:
附录:
mysql命令:use movie;
show tables;
desc admin;
测试插入一条数据
if __name__ == "__main__": db.create_all() role = Role( name="超级管理员", auths="" ) db.session.add(role) db.session.commit()
from werkzeug.security import generate_password_hash admin = Admin( name="mtianyanmovie", pwd=generate_password_hash("mtianyanmovie"), is_super=0, role_id=10 ) db.session.add(admin) db.session.commit()
注意这里的roleid 应该是你数据库里存在的role id 否则会产生外键错误。
转载地址:http://soykm.baihongyu.com/