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

    大道理谁都懂,鸡汤也听过,可我们为什么还是过不好这一生。
  • 相关阅读:
    国外摄影网站
    网络基础之子网划分
    Java-多线程第三篇3种创建的线程方式、线程的生命周期、线程控制、线程同步、线程通信
    Java-多线程第二篇多线程相关认识(2)
    设计模式-第八篇之桥接模式
    设计模式-第七篇之门面模式
    设计模式-第六篇之策略模式
    设计模式-第五篇之命令模式
    设计模式-第四篇之代理模式
    设计模式-第九篇之观察者模式
  • 原文地址:https://www.cnblogs.com/puqunzhu/p/10019281.html
Copyright © 2020-2023  润新知