Python Flask 構建微電影視頻網站


  “輕”是Flask的精髓,小型項目快速開發,大型項目毫無壓力

  • 1-1 課程導學及介紹
  • 1-2 Windows環境搭建
  • 2-2 Mac OS環境搭建
  • 2-3 第一Flask程序
  • 3-1 項目分析及會員登錄
  • 3-2 標簽-電影-上映預告數據模型設計
  • 3-3 評論-收藏-權限-管理員-操作日志數據模型設計
  • 4-1 前台布局-會員登錄頁面搭建
  • 4-2 會員注冊-會員中心頁面搭建
  • 4-3 電影列表-搜索頁面搭建
  • 4-4 電影詳情頁-404頁面搭建
  • 5-1 管理員登錄-后台布局搭建
  • 5-2 修改密碼-控制面板-標簽管理頁面搭建
  • 5-3 電影管理-上映預告管理頁面搭建
  • 5-4 會員-收藏-評論管理頁面搭建
  • 5-5 收藏-日志-角色管理頁面搭建
  • 5-6 管理員頁面搭建
  • 6-1 管理員登錄
  • 6-2 標簽管理
  • 6-3 電影管理-添加電影
  • 6-4 電影管理-列表、刪除、編輯
  • 6-5 預告管理
  • 6-6 會員管理
  • 6-7 評論-收藏管理
  • 6-8 修改密碼
  • 6-9 日志管理
  • 7-1 權限管理
  • 7-2 角色管理
  • 7-3 管理員管理
  • 7-4 訪問權限控制
  • 8-1 會員注冊
  • 8-2 會員登錄
  • 8-3 修改會員資料
  • 8-4 修改密碼
  • 8-5 會員登錄日志
  • 9-1 上映預告-標簽篩選-電影分頁
  • 9-2 電影搜索-電影詳情
  • 10-1 電影評論-統計
  • 10-2 收藏電影
  • 10-3 電影彈幕-代碼優化及Bug處理
  • 11-1 CentOS安裝LNMP
  • 11-2 部署電影網站-流媒體訪問限制

1-1 課程導學及介紹

  • 學會使用整型、浮點型、路徑型、字符串型正則表達式路由轉化器;

  • 學會使用post與get請求、上傳文件、cookie獲取與響應、404處理;

  • 學會使用模板自動轉義、定義過濾器、定義全局上下文處理器、Jinja2語法、包含、繼承、定義宏;

  • 學會使用Flask-wtf定義表單模型、字段類型、字段驗證、視圖處理表單、模板使用表單;

  • 學會使用flask-SQLAlchemy定義數據庫模型、添加數據、修改數據、查詢數據、刪除數據、數據庫事件、數據遷移;

  • 學會使用藍圖優化項目結構、實現微電影網站前后台業務邏輯;

  • 學會flask的部署方法、安裝編譯Nginx服務、安裝編譯Python3.6服務、安裝MySQL服務以及通過Nginx反向代理對視頻流媒體限制下載速率、限制單個IP能發起的播放連接數;


 

1-2 Windows環境搭建

1.2.1 操作系統:Win7;

1.2.2 編程語言:Python3.6;

1.2.3 數據庫:MySQL5.7;

1.2.4 虛擬化開發環境:virtualenv;

1.2.5 IDE:Pycharm; 

使用豆瓣源安裝pip install ,國內鏡像地址,速度會快很多。用法:pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com flask

2-2 MacOS環境搭建

2.2.1 Python3.6;

2.2.2 Pycharm2018.3;

2.2.3 MySQL8.0.12;

2.2.4 注意pip install flask 以及pip3 install flask的區別;

2-3 第一Flask程序

2.3.1 virtualenv的使用;

  • virtualenv venv

2.3.2 flask的安裝;

  • pip3 install flask
  • pip3 freeze
  • deactivate # 退出虛擬化環境

2.2.3 第一個flask程序的編寫;

  • 安裝flask==“0.12.2”
#!/usr/bin/python3
# -*- coding:utf-8 -*-
# Project: MicroFilm 
# Software: PyCharm
# Time    : 2018-09-28 16:29
# File    : app.py
# Author  : 天晴天朗
# Email   : tqtl@tqtl.org
from flask import Flask

app = Flask(__name__)


@app.route("/")
def index():
    return "<h1 style = 'color:red'>Hello Flask!</h1>"


if __name__ == '__main__':
    app.run()

3-1 項目分析及會員登錄

3.1.1 項目分析、搭建目錄及模型設計;

3.1.2 前后目錄結構分析;

3.1.3 使用藍圖(藍本Blueprint)來構建項目目錄;

1)什么是藍圖?

  • 一個應用中或跨應用制作應用組件和支持通用的模式;

2)藍圖的作用?

  • 將不同的功能模塊化;
  • 構建大型應用;
  • 優化項目結構;
  • 增強可讀性、易於維護;

3.1.4 藍圖的使用步驟:

  • 定義藍圖;
  • 注冊藍圖;
  • 調用藍圖;

 3.1.5 會員及會員登錄日志數據模型設計;

  1)安裝數據庫連接工具flask-SQLAlchemy(企業級Python的ORM對象關系映射框架,面向對象的思想);

  2)定義MySQL數據庫連接基於pymysql+ mysql;

  3)pip3 install flask-sqlalchemy的安裝;

 3.1.5 定義數據模型;

  • pip3 install flask-sqlalchemy;

 3.1.6 配置SQLAlchemy;

SQLAlchemy在線文檔:http://www.pythondoc.com/flask-sqlalchemy/config.html

app/models.py的設計;

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# Project: MicroFilm 
# Software: PyCharm
# Time    : 2018-09-28 16:36
# File    : models.py
# Author  : 天晴天朗
# Email   : tqtl@tqtl.org
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import datetime

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:Tqtl911!@#)^@localhost:3306/MicroFilm/"
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(100), unique=True)  # 昵稱
    pwd = db.Column(db.String(100), unique=True)  # 密碼
    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 "<User %r>" % 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 "<UserLog %r>" % self.id

3-2 標簽-電影-上映預告數據模型設計

3.2.1 標簽數據模型的設計;

3.2.2 電影數據模型設計;

3.2.3 上映預告數據模型的設計;

app/models.py; 

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# Project: MicroFilm 
# Software: PyCharm
# Time    : 2018-09-28 16:36
# File    : models.py
# Author  : 天晴天朗
# Email   : tqtl@tqtl.org
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:Tqtl911!@#)^@localhost:3306/MicroFilm/"
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(100), unique=True)  # 昵稱
    pwd = db.Column(db.String(100), unique=True)  # 密碼
    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 "<User %r>" % 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 "<UserLog %r>" % 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 "<Tag %r>" % 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.utcnow)  # 添加時間

    def __repr__(self):
        return "<Movie %r>" % 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 "<Preview %r>" % self.title

3-3 評論-收藏-權限-管理員-操作日志數據模型設計

3.3.1 定義評論數據模型;

3.3.2 定義收藏電影數據模型;

3.3.3 定義權限數據模型;

3.3.4 定義角色數據模型;

3.3.5 定義管理員數據模型;

3.3.6 定義登錄日志操作數據模型;

3.3.7 定義操作日志數據模型;

 3.3.8 ModuleNotFoundError: No module named 'MySQLdb'報錯處理之pip3 install pymysql;

3.3.9 執行python3 models.py 進行生成數據表操作;

 app/models.py;

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# Project: MicroFilm 
# Software: PyCharm
# Time    : 2018-09-28 16:36
# File    : models.py
# Author  : 天晴天朗
# Email   : tqtl@tqtl.org
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
import pymysql

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:Tqtl911!@#)^@localhost:3306/MicroFilm"
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(100), unique=True)  # 昵稱
    pwd = db.Column(db.String(100), unique=True)  # 密碼
    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)  # 唯一標識符
    userlogs = db.relationship("UserLog", backref="user")  # 會員日志外鍵關聯
    comments = db.relationship("Comment", backref="user")  # 評論外鍵關聯
    moviecols = db.relationship("MovieCol", backref="user")  # 收藏外鍵關聯

    def __repr__(self):
        return "<User %r>" % 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.now)  # 登錄時間;

    def __repr__(self):
        return "<UserLog %r>" % 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.now)  # 添加時間
    movies = db.relationship("Movie", backref="tag")  # 電影外鍵關系的關聯

    def __repr__(self):
        return "<Tag %r>" % 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 "<Movie %r>" % 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 "<Preview %r>" % 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.now)  # 添加時間

    def __repr__(self):
        return "<Comment %r>" % 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.now)  # 添加時間

    def __repr__(self):
        return "<MovieCol %4>" % 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 "<Auth %r>" % 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)  # 添加時間

    def __repr__(self):
        return "<Role %r>" % 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), unique=True)  # 密碼
    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 "<Admin %r>" % self.name


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))
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)

    def __repr__(self):
        return "<AdminLog %r>" % 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 "<OpLog %r>" % self.id


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="ImoocMovie1",
        pwd=generate_password_hash("ImoocMovie1"),
        is_super=0,
        role_id=1
    )
    db.session.add(admin)
    db.session.commit()

4-1 前台布局-會員登錄頁面搭建

4.1.1 拷貝前端同事分享的static下的目錄文件; 

4.1.2 templates新增index.html、home.html;

4.1.3 報錯待處理block 后面添加content對象;

index.html;

{% extends "home/home.html" %}

{% block content %}
<h1>Hello Flask!!!</h1>
{% endblock %}

home.html;

<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1 , user-scalable=no">
    <title>微電影</title>
    <link rel="shortcut icon" href="{{ url_for('static',filename ='base/images/logo.png') }}">
    <link rel="stylesheet" href="{{ url_for('static',filename ='base/css/bootstrap.min.css') }}">
    <link rel="stylesheet" href="{{ url_for('static',filename ='base/css/bootstrap-movie.css') }}">
    <link rel="stylesheet" href="{{ url_for('static',filename ='base/css/animate.css') }}">
    <style>
        .navbar-brand > img {
            display: inline;
        }

    </style>
    <style>
        .media {
            padding: 3px;
            border: 1px solid #ccc
        }

    </style>
</head>

<body>
<!--導航-->
<nav class="navbar navbar-default navbar-fixed-top">
    <div class="container">
        <!--小屏幕導航按鈕和logo-->
        <div class="navbar-header">
            <button class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a href="index.html" class="navbar-brand" style="width:250px;">
                <img src="{{ url_for('static',filename = 'base/images/logo.png') }}" style="height:30px;">&nbsp;微電影

            </a>
        </div>
        <!--小屏幕導航按鈕和logo-->
        <!--導航-->
        <div class="navbar-collapse collapse">
            <form class="navbar-form navbar-left" role="search" style="margin-top:18px;">
                <div class="form-group input-group">
                    <input type="text" class="form-control" placeholder="請輸入電影名!">
                    <span class="input-group-btn">
                        <a class="btn btn-default" href="search.html"><span class="glyphicon glyphicon-search"></span>&nbsp;搜索</a>
                    </span>
                </div>
            </form>
            <ul class="nav navbar-nav navbar-right">
                <li>
                    <a class="curlink" href="index.html"><span class="glyphicon glyphicon-film"></span>&nbsp;電影</a>
                </li>
                <li>
                    <a class="curlink" href="login.html"><span class="glyphicon glyphicon-log-in"></span>&nbsp;登錄</a>
                </li>
                <li>
                    <a class="curlink" href="register.html"><span class="glyphicon glyphicon-plus"></span>&nbsp;注冊</a>
                </li>
                <li>
                    <a class="curlink" href="logout.html"><span class="glyphicon glyphicon-log-out"></span>&nbsp;退出</a>
                </li>
                <li>
                    <a class="curlink" href="user.html"><span class="glyphicon glyphicon-user"></span>&nbsp;會員</a>
                </li>
            </ul>
        </div>
        <!--導航-->

    </div>
</nav>
<!--導航-->
<!--內容-->
<div class="container" style="margin-top:76px">
    {% block content %}{% endblock %}
</div>
<!--內容-->
<!--底部-->
<footer>
    <div class="container">
        <div class="row">
            <div class="col-md-12">
                <p>
                    ©&nbsp;2018&nbsp;microfilm.cuixiaozhao.com&nbsp;京ICP備 13046642號-2
                </p>
            </div>
        </div>
    </div>
</footer>
<!--底部-->
<script src="{{ url_for('static',filename = 'base/js/jquery.min.js') }}"></script>
<script src="{{ url_for('static',filename = 'base/js/bootstrap.min.js') }}"></script>
<script src="{{ url_for('static',filename = 'base/js/jquery.singlePageNav.min.js') }}"></script>
<script src="{{ url_for('static',filename = 'base/js/wow.min.js') }}"></script>
<script src="{{ url_for('static',filename = 'lazyload/jquery.lazyload.min.js') }}"></script>
<script src="//cdn.bootcss.com/holder/2.9.4/holder.min.js"></script>
<script>
    $(function () {
        new WOW().init();
    })

</script>
<script>
    $(document).ready(function () {
        $("img.lazy").lazyload({
            effect: "fadeIn"
        });
    });
</script>
</body>
</html>

4.1.4 頁面呈現;

4-2 會員注冊-會員中心頁面搭建

4.2.1 定義登錄頁面的視圖函數:login/logout;

4.2.2 開發index.html,繼承home.html並添加{% block content %} {% endblock %}區塊;

4.2.3 home/home.html頁面中{{ url_for('home.login') }} 和{{ url_for('home.logout') }}的使用;


4.2.4 會員注冊頁面的搭建過程;

 

 4.2.5 會員中心頁面搭建;

4-3 電影列表-搜索頁面搭建

4.3.1 電影列表頁面搭建;

4.3.2 首頁index.html呈現;

4.3.3 電影搜索頁面搭建;

4-4 電影詳情頁-404頁面搭建

4.4.1 404頁面處理;

4.4.2 404視圖函數代碼在app/__init__.py中編寫;

app/__init__.py;

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# Project: MicroFilm 
# Software: PyCharm
# Time    : 2018-09-28 16:36
# File    : __init__.py.py
# Author  : 天晴天朗
# Email   : tqtl@tqtl.org

from flask import Flask, render_template

app = Flask(__name__)

app.debug = True

from app.home import home as home_blueprint
from app.admin import admin as admin_blueprint

app.register_blueprint(home_blueprint)
app.register_blueprint(admin_blueprint, url_prefix="/admin")


@app.errorhandler(404)
def page_not_found(error):
    return render_template("home/404.html"), 404 

5-1 管理員登錄-后台布局搭建

5.1.1 后台布局搭建;

5.1.2 管理員的登錄和退出;

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# Project: MicroFilm 
# Software: PyCharm
# Time    : 2018-09-28 16:38
# File    : views.py
# Author  : 天晴天朗
# Email   : tqtl@tqtl.org

from . import admin
from flask import render_template, redirect, url_for


@admin.route("/")
def index():
    return "<h1 style='color:blue'>This is admin site!<h1>"


@admin.route("/login/")
def login():
    return render_template("admin/login.html")


@admin.route("/logout/")
def logout():
    return redirect(url_for("admin.login"))

5.1.3 后台布局搭建;

5.1.4 include引用報錯處理;

5.1.5 修改密碼;

5-2 修改密碼-控制面板-標簽管理頁面搭建

5.2.1 修改密碼;

5.2.2 控制面板;

5.2.3 調整頁面,顯示內存儀表盤;

5.2.4 標簽管理頁面搭建;

 

5-3 電影管理-上映預告管理頁面搭建

5.3.1 編輯電影和電影列表;

 

5.3.2 編輯上映預告和上映電影列表;

5-4 會員-收藏-評論管理頁面搭建

5.4.1  會員列表;

5.4.2 評論管理頁面搭建;

5-5 收藏-日志-角色管理頁面搭建

5.5.1 收藏管理列表搭建;

5.5.2 操作日志列表;

5.5.3 角色管理列表搭建;

5.5.4 添加權限和權限列表;

5-6 管理員頁面搭建

5.6.1 管理員頁面搭建;

6-1 管理員登錄

6.1.1 調整項目代碼結構;

6.1.2 flask-wtf第三方模塊的安裝;

6.1.3 編寫LoginForm類以及報錯處理;

 

 

 

6-2 標簽管理

6.2.1 標簽管理;

6-3 電影管理-添加電影

6.3.1 電影管理;

6-4 電影管理-列表、刪除、編輯

6.4.1 電影列表;

 

6-5 預告管理

6-6 會員管理

6-7 評論-收藏管理

6-8 修改密碼

6-9 日志管理

7-1 權限管理

7-2 角色管理

7-3 管理員管理

7-4 訪問權限控制

8-1 會員注冊

8-2 會員登錄

8-3 修改會員資料

8-4 修改密碼

8-5 會員登錄日志

9-1 上映預告-標簽篩選-電影分頁

9-2 電影搜索-電影詳情

10-1 電影評論-統計

10-2 收藏電影

10-3 電影彈幕-代碼優化及Bug處理

11-1 CentOS安裝LNMP

11.1.1 LNMP即——Linux + Nginx + MySQL+Python;

  • 安裝Python解釋器的依賴包 yum install openssl-devel bzip2-devel expat-deval gdbm-devel realine-devel gcc gcc-c++
  • 解壓縮Python-3.6.1.tgz
  • yum install mariadb;systemctl start mariadb.service;
  • 修改mariadb的字符集為utf8,my.cnf文件;
  • yum install nginx;# 推薦使用yum安裝
  • yum install gcc gcc-c++ opensll-devel pere-devel httpd-tools;
  • 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 /usr/sbin/
  • nginx 
  • netstat -lntup|grep nginx

11-2 部署電影網站-流媒體訪問限制

11.2.1 部署微電影網站;

  • pip3 install -i https://pypi.douban.com/simple --trusted-host pypi.douban.com  -r requirements.txt;
  • scp -r movie_project root@192.168.0.1:/root/# 程序包;
  • 數據庫中導入初始化數據;source /root/movie.sql;
  • cp -a  movie_project /usr/local/html/下;
  • nohup python manage.py runserver -h 127.0.0.1 -p 5000,開啟四個進程;

 

 

 

11.2.2 流媒體的訪問限制;

  • 限制單個IP能發起的連接數:limit_conn addr:1;
  • 限制視頻速率:limit_rate 1024K;
  • 修改配置后,一定記得重啟nginx,重啟之前進行語法檢查!!!nginx -t ;  sytemctl reload nginx;

nginx.conf; 

worker_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 {
        server 127.0.0.1:5001;
        server 127.0.0.1:5002;
        server 127.0.0.1:5003;
        server 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 4;
            limit_rate 1024k;
            rewrite ^/static/uploads/(.+?).flv$ /movie_project/app/static/uploads/$1.flv permanent;
        }
        location ~ \.mp4$ {
            mp4;
            limit_conn addr 4;
            limit_rate 1024k;
            rewrite ^/static/uploads/(.+?).mp4$ /movie_project/app/static/uploads/$1.mp4 permanent;
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }
}

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM