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()

大道理谁都懂,鸡汤也听过,可我们为什么还是过不好这一生。
原文地址:https://www.cnblogs.com/puqunzhu/p/10019281.html