flask 微电影网站
flask简介
轻量级web应用框架
WSGI工具箱才用Werkzeug
模版引擎则使用Jinja2
Flask使用BSD授权
1.virtualenv的使用
(1)创建虚拟环境:virtualenv venv
(2) 激活虚拟环境:source venv/bin/activate
(3) 退出虚拟环境: deactivate
2.flask的安装
(1)安装前检测:pip freeze
(2) 安装flask:pip install flask
(3) 安装后检测:pip freeze
前后台项目目录分析
manage.py 入口启动脚本
app 项目APP
__init__.py 初始化文件
models.py 数据模型文件
static 静态目录
home/admin 前台/后台模块
__init__.py 初始化脚本
views.py 视图处理文件
forms.py 表单处理文件
templates 模版目录
home/admin 前台/后台模版
蓝图构建项目目录
1.什么是蓝图?
一个应用中或跨应用制作应用组件和支持通用的模式
2.蓝图的作用?
将不同的功能模块化
构建大型应用
优化项目结构
增强可读性,易于维护
1.定义蓝图(app/admin/__init__.py)
from flask import Blueprint
admin = Blueprint("admin",__name__)
import views
2.注册蓝图(app/__init__.py)
from admin import admin as admin_blueprint
app.register_blueprint(admin_blueprint,url_prefix="/admin")
3.调用蓝图(app/admin/views.py)
from . import admin
@admin.route("/")
会员及会员登录日志数据模型设计
1.安装数据库连接依赖包
pip install flask-sqlalchemy
2.定义mysql数据库连接
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://root:root@localhost/movie"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = 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)
定义会员数据模型
id:编号、name:账号、pwd:密码、
email:邮箱、phone:手机号、info:简介、
face:头像、addtime:注册时间、uuid:唯一标志符、comments:评论外键关联、userlogs:会员登录日志外键关联、
moviecols:电影收藏外键关联
定义会员登录日志数据模型
id:编号
user_id:所属会员编号、
ip:最近登录IP地址、
addtime:最近登录时间
定义标签数据模型
id:编号
name:标题、
movies:电影外键关联、
addtime:创建时间
定义电影数据模型
id:编号、title:电影标题、url:电影地址、
info:电影简介、logo:电影封面、star:星级、
playnum:电影播放量、commentnum:电影评论量、tag_id:所有标签、area:地区、release_time:发布时间、length:电影长度、addtime:添加时间、comments:电影评论外键关联、moviecols:电影收藏外键关联
定义上映预告数据模型
id:编号、
title:上映预告标题、
logo:上映预告封面、
addtime:创建时间
定义评论数据模型
id:编号、
content:评论内容、
movie_id:所属电影、
user_id:所属用户、
addtime:最近登录时间
定义收藏电影数据模型
id:编号、
movie_id:所属电影、
user_id:所属用户、
addtime:最近登录时间
权限及角色数据模型设计
定义权限数据模型
id:编号
name:名称
url:地址
addtime:创建时间
定义角色数据模型
id:编号、
name:名称、
auths:权限列表、
addtime:创建时间、
admins:管理员外键关联
管理员、登录日志、操作日志数据模型设计
定义管理员数据模型
id:编号、
name:管理员名称、
pwd:管理员密码
is_super:是否超级管理员
role_id:角色编号、
addtime:创建时间、
adminlogs:管理登录日志外键关联
oplogs:操作日志外键关联
定义管理员登录日志数据模型
id:编号、
admin_id:所属管理员编号、
ip:最近登录IP地址、
addtime:最近登录时间
定义操作日志
id:编号、
admin_id:所属管理员编号、
ip:操作IP地址、
reason:操作原因、
addtime:创建时间
搭建前台页面
前台布局搭建
1.静态文件引入:{{url_for('static',filename='文件路径')}}
2.定义路由:{{url_for("模块名.视图名",变量=参数)}}
3.定义数据块:{% block 数据块名称 %}...{% endblock %}
会员登录页面搭建
# 登录
@home.route("/login/")
def login():
return render_template("home/login.html")
# 退出
@home.route("/logout/")
def logout():
return redirect(url_for('home.login')
# 注册
@home.route("/register/")
def register():
return render_template("home/register.html")
会员中心页面搭建
# 会员中心
@home.route("/user/")
# 修改密码
@home.route("/pwd/")
# 评论记录
@home.route("/loginlog/")
# 收藏电影
@home.route("/moviecol/")
电影列表页面搭建
# 列表
@home.route("/")
def index():
return render_template("home/index.html")
# 动画
@home.route("/animation/")
def animation():
return render_template("home/animation.html")
电影搜索页面搭建
# 搜索
@home.route("/search/")
def search():
return render_template("home/search.html")
电影详情页面搭建
@home.route("/play/")
def play():
return render_template("home/play.html")
404页面搭建
# 404
@app.errorhandler(404)
def page_not_found(error):
return render_template("common/404.html"),404
搭建后台页面
管理员登录页面搭建
# 登录
@admin.route("/login/")
def login():
return render_template("admin/login.html")
# 退出
@admin.route("/logout/")
def logout():
return redirect(url_for("admin.login")
后台布局搭建
#admin.html
{% block css %}...{% end %}
{% include "grid.html" %}
{% block content %}...{% end %}
{% block js%}...{% end %}
# 其他页面继承父模版
{% extends "admin/admin.html"%}
{% block css %}...{% end %}
{% include "grid.html" %}
{% block content %}...{% end %}
{% block js%}...{% end %}
#修改密码
@admin.route("/pwd/")
def pwd():
return render_template("admin/pwd.html")
# 系统管理
@admin.route("/")
def index():
return render_template("admin/index.html")
标签管理页面搭建
#编辑标签
@admin.route("/tag/add/")
def tag_add():
return render_template("admin/tag_add.html")
# 标签列表
def tag_list():
return render_template("admin/tag_list.html")
电影管理页面搭建
# 编辑电影
@admin.route("/movie/add/")
def movie_add():
return render_template("admin/movie_add.html")
# 电影列表
@admin.route("/movie/list/")
def movie_list():
return render_template("admin/movie_list.html")
上映预告管理页面搭建
#编辑上映预告
@admin.route("/preview/add/")
def preview_add():
return render_template("admin/preview_add.html")
# 上映预告列表
@admin.route("preview/list/")
def preview_list():
return render_template("admin/preview_list.html")
会员管理页面搭建
#会员列表
@admin.route("/user/list/")
def user_list():
return render_template("admin/user-list.html")
#查看会员
@admin.route("/user/view/")
def user_view():
return render_template("admin/user_view.html")
评论管理页面搭建
# 评论列表
@admin.route("/comment/list/")
def comment_list():
return render_template("admin/comment_list.html")
收藏管理页面搭建
# 收藏列表
@admin.route('/moviecol/list/')
def moviecol_list():
return render_template("admin/moviecol_list.html")
操作日志管理页面搭建
# 操作日志列表
@admin.route('/oplog/list/')
def oplog_list():
return render_template("admin/oplog_list.html")
# 管理员日志列表
@admin.route("/adminloginlog/list/")
def adminloginlog_list():
return render_template("admin/adminloginlog_list.html")
# 会员日志列表
@admin.route("/userloginlog/list")
def userloginlog_list():
return render_template("admin/userloginlog_list.html")
角色管理页面搭建
#添加角色
@admin.route('/role/add/')
def role_add():
return render_template("admin/role_add.html")
#角色列表
@admin.route('/role/list/')
def role_list():
return render_template("admin/role_list.html")
管理员管理页面搭建
# 添加管理员
@admin.route('/admin/add/')
def admin_add():
return render_template("admin/admin_add.html")
# 管理员列表
@admin.route('/admin/list/')
def admin_list():
return render_template("admin/admin_list.html")
管理员登录
1.app/__init__.py中创建db对象
2.app/models.py中导入db对象
3.app/admin/forms.py中定义表单验证
4.app/templates/admin/login.html中使用表单字段、信息验证、消息闪现
5.app/admin/views.py中处理登录请求、保持会话
6.app/admin/views.py定义登录装饰器、访问控制
1.模型:Admin
2.表单:LoginForm
3.请求方法:GET、POST
4.访问控制:无
标签管理
1.模型:Tag
2.表单:TagForm
3.请求方法:GET、POST
4.访问控制:@admin_login_req
电影管理
1.模型:Movie
2.表单:MovieForm
3.请求方法:GET、POST
4.访问控制:@admin_login_req
预告管理
1.模型:Preview
2.表单:PreviewForm
3.请求方法:GET、POST
4.访问控制:@admin_login_req
会员管理
1.模型:User
2.表单:无
3.请求方法:GET、POST
4.请求控制:@admin_login_req
评论管理
1.模型:Comment
2.表单:无
3.请求方法:GET
4.访问控制:@admin_login_req
修改密码
1.模型:Admin
2.表单:PwdForm
3.请求方法:GET、POST
4.访问控制:@admin_login_req
日志管理
1.模型:Oplog、Userlog、Adminlog
2.表单:无
3.请求方法:GET
4.访问控制:@admin_login_req
基于角色的访问控制
权限管理
1.模型:Auth
2.表单:AuthForm
3.请求方法:GET、POST
4.访问控制:@admin_login_req
访问权限控制
#定义权限装饰器
def admin_auth(f):
@wraps(f)
def decorate_function(*args,**kwargs):
#权限查询
abort(404)
return decorate_function
#调用权限装饰器
@admin_auth
会员注册
1.模型:User
2.表单:RegisterForm
3.请求方法:GET、POST
服务器部署:
cat /etc/redhat-release
cat /proc/cpuinfo
free -m
df -h
yum -y install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
wget -c https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz
tar -zxf Python-3.6.1.tgz
./configure --prefix=/usr/local
yum -y install gcc gcc-c++
./configure --prefix=/usr/local
make altinstall
ls /usr/local/bin/
cd /usr/bin/
mv python python.backup
ln -s /usr/local/bin/python3.6 /usr/bin/python
ln -s /usr/local/bin/python3.6 /usr/bin/python3
cd /usr/bin/
ls yum*
vim yum
yum -y install mariadb-server
systemctl start mariadb.service
systemctl enable mariadb.service
vim /etc/my.cnf
character-set-server=utf8
systemctl restart mariadb.service
wget http://nginx.org/download/nginx-1.12.0.tar.gz
yum -y install gcc gcc-c++ openssl-devel pcre-devel httpd-tools
tar -zxf nginx-1.12.0.tar.gz
cd nginx-1.12.0
ls
useradd nginx
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_mp4_module --with-http_flv_module
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
cd ~
nginx
netstat -anptu | grep nginx
req.txt
click==6.7
Flask==0.12.2
Flask-Script==2.0.5
Flask-SQLAlchemy==2.2
Flask-WTF==0.14.2
itsdangerous==0.24
jinja2==2.9.6
MarkupSafe==1.0
PyMySQL==0.7.11
Werkzeug==0.12.2
WTForms==2.1
pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com -r req.txt
cp -r movie /usr/local/nginx/html
vim /usr/local/nginx/conf/nginx.conf
work_processes 4;
events {
worker_connections 262140
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
limit_conn_zone \(binary_remote_addr zone=addr:5m;
upstream movie {
service 127.0.0.1:5001;
service 127.0.0.1:5002;
service 127.0.0.1:5003;
service 127.0.0.1:5004;
}
server {
listen 80;
server_name localhost;
location / {
root html
index index.html index.htm;
proxy_pass http://movie;
}
location ~ \.flv\) {
flv;
limit_conn addr 1;
limit_rate 1024k;
rewrite ^/static/uploads/(.+?).flv$ /movie/app/static/uploads/\(1.flv permanent;
}
location ~ \.mp4\) {
mp4;
limit_conn addr 1;
limit_rate 1024k;
rewrite ^/static/uploads/(.+?).mp4$ /movie/app/static/uploads/$1.mp4 permanent;
}
error_page 500 502 503 504/50x.html;
location = /50x.html{
root html;
}
}
}
from app import create_app
application = create_app('production')
if name == 'main':
application.run()