本文共 17842 字,大约阅读时间需要 59 分钟。
已上线演示地址:
项目源码地址:本节教程对应github : commit:1-3完结并将ip密码省去.
持续更新教程与代码commit。欢迎大家一起学习,star。
flask:轻量级,冗余度小,扩展丰富,可以自由选择组合各种插件,性能优越。
前台加后台微电影网站.
前台首页-电影筛选-电影列表- 播放详情-评论:收藏-搜索-注册-登录-会员中心(修改会员资料,查看评论记录,登录日志,收藏电影)
后台-标签-电影管理-预告-会员-评论-收藏-日志-权限管理-角色-管理员。
适合人群:pythoner
个人必备基础:
flask + mysql
开发及生产环境:
国内知名的使用python做web开发。
python框架对比:
werkzeug封装了许多功能:文件上传。生成密码,校验密码等。
微内核框架:
微内核 + 丰富的扩展插件:
pip install virtualenv
pycharm:新建文件->点击run运行
virtualenv的使用:
error:
安装flask报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb6 in position 33: invalid start byte当前虚拟环境\lib\site-packages\pip\compat_init_.py约75行
return s.decode('utf_8') 改为return s.decode('cp936')
点击新建project->movie_project->选择解释环境为刚才新建的flask3
# _*_ coding: utf-8 _*___author__ = 'mtianyan'__date__ = '2017/8/26 16:56'from flask import Flaskapp = Flask(__name__)@app.route("/")def index(): return "Hello World!
"if __name__ == "__main__": app.run()
右键点击run之后:控制台画面如下:
点击链接可看到红色的helloworld,此时flask安装及运行成功。
微电影网站:
前台模块:
后台
前台后台表单处理,模板目录独立。数据模型共有。
前后台目录分析:
pythonpackage:
directory:
最终项目目录如下图:
一个应用中或跨应用制作应用组件和支持通用的模式
将项目合理规划,易于扩展。
app/admin/__init__.py
)from flask import Blueprintadmin = Blueprint("admin",__name__)import views
app/__init__.py
)from admin import admin as admin_blueprintapp.register_blueprint(admin_blueprint,url_prefix="admin")
app/admin/views.py
)from . import admin@admin.route("/")
home/init.py:
from . import home@home.route("/")def index(): return "this is home
"
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:
# _*_ coding: utf-8 _*___author__ = 'mtianyan'__date__ = '2017/8/26 17:06'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)红色安装数据库连接依赖包
pip install flask-sqlalchemy
:sqlalchemy(企业级的orm对象关系映射框架。面向对象的思想操作数据库)定义mysql数据库连接:
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.utcnow) uuid = db.Column(db.String)
mysql -uroot -p密码
进入mysql控制台create database movie;
来创建数据库models.py:
# _*_ 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:ty158917@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.utcnow)#注册时间 uuid = db.Column(db.String(255),unique=True)#唯一标识符 #(设置外键的第二步) userlogs = db.relationship('userlog',backref = 'user')#会员日志外键关系关联 def __repr__(self): return '' % self.name#会员登录日志class Userlog(db.Model): __tablename__ = "userlog" #(设置外键的第一步) id = db.Column(db.Integer,primary_key=True)#编号 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.utcnow)#登录时间 def __repr__(self): return ' ' % self.id
注意设置外键分为两步进行。
# 标签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.utcnow) # 添加电影时间 # (设置外键的第二步) 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) # 播放量c 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.utcnow) # 添加时间 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.utcnow) # 添加时间 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) # 内容 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.utcnow) # 添加时间 def __repr__(self): return "" % self.id# 电影收藏class Moviecol(db.Model): __tablename__ = "moviecol" id = db.Column(db.Integer, primary_key=True) # 编号 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.utcnow) # 添加时间 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服务器上的数据库,消除了警告。
完整models.py代码:
# _*_ coding: utf-8 _*_from datetime import datetime__author__ = 'mtianyan'__date__ = '2017/8/26 17:05'from flask import Flaskfrom flask_sqlalchemy import SQLAlchemyimport pymysqlapp = Flask(__name__)#用于连接数据的数据库。app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://用户名:密码@ip地址: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.utcnow)#注册时间 uuid = db.Column(db.String(255),unique=True)#唯一标识符 #(设置外键的第二步) 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 =db.Column(db.Integer,db.ForeignKey('user.id'))#所属会员 ip = db.Column(db.String(100))#ip地址 addtime = db.Column(db.DateTime,index=True,default=datetime.utcnow)#登录时间 def __repr__(self): return ' ' % self.id# 标签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.utcnow) # 添加电影时间 # (设置外键的第二步) 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) # 播放量c 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.utcnow) # 添加时间 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.utcnow) # 添加时间 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) # 内容 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.utcnow) # 添加时间 def __repr__(self): return " " % self.id# 电影收藏class Moviecol(db.Model): __tablename__ = "moviecol" id = db.Column(db.Integer, primary_key=True) # 编号 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.utcnow) # 添加时间 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.idif __name__ == "__main__": db.create_all()
最终映射成功后的数据表:
附录:
mysql命令:use movie;
show tables;
desc admin;
转载地址:http://ktfbm.baihongyu.com/