“輕”是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;"> 微電影 </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> 搜索</a> </span> </div> </form> <ul class="nav navbar-nav navbar-right"> <li> <a class="curlink" href="index.html"><span class="glyphicon glyphicon-film"></span> 電影</a> </li> <li> <a class="curlink" href="login.html"><span class="glyphicon glyphicon-log-in"></span> 登錄</a> </li> <li> <a class="curlink" href="register.html"><span class="glyphicon glyphicon-plus"></span> 注冊</a> </li> <li> <a class="curlink" href="logout.html"><span class="glyphicon glyphicon-log-out"></span> 退出</a> </li> <li> <a class="curlink" href="user.html"><span class="glyphicon glyphicon-user"></span> 會員</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> © 2018 microfilm.cuixiaozhao.com 京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; } } }





