利用Flask搭建微电影视频网站(三):前端首页搭建
关于博主
努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!
微信公众号: 啃饼思录
QQ: 2810706745(啃饼小白)
写在前面
本篇笔记,我们来学习Flask网站前端首页面的搭建,这其实和Django搭建网页很类似,大家好好体会一下。
本篇笔记对应上传的仓库为:https://github.com/licheetools/movie对应第三篇。
前台布局搭建
第一步将所有static文件都放进指定的位置:
然后在templates/home文件夹下面新建一个home.html文件,将tpl/2-movie/nav.html文件内容全部拷贝到我们刚才新建的home.html页面里面,然后修改我们静态文件的目录,可以按照下面的图片要求进行:
1、静态文件的引入
{{ url_for('static',filename='文件路径')}}
2、定义路由
{{ url_for('模块名.视图名',变量=参数)}}
3、定义数据块
{%block 数据块名称%} .....{% endblock %}
# 原来代码为 <link rel="stylesheet" href="../static/base/css/bootstrap.min.css">
# 现在代码为 <link rel="stylesheet" href="{{ url_for('static', filename='base/css/bootstrap.min.css') }}">
其余所有的js, jpg,css均按照这样的要求进行,这里就不再一一提示了,直接附上代码:
<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') }}">
<img src="{{ url_for('static', filename='base/images/logo.png') }}" style="height:30px;"> 微电影
<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>
接着在图示位置进行挖坑填坑操作:
<div class="container" style="margin-top:76px">
{% block content %}{% endblock %}
</div>
然后打开home模块的视图处理器(home/views.py):
from . import home
from flask import render_template
@home.route('/')
def index():
return render_template("home/index.html")i
你发现没有此刻我们在templates/home文件夹下面是没有index.html文件的,我们需要去创建一个index.html文件,在里面输入如下代码:
{% extends "home.html" %}
{% block %}
<h1>helloworld</h1>
{% endblock %}
然后运行一下我们的manage.py文件,在浏览器地址栏中输入http://127.0.0.1:5000/ 出现了错误:
错误提示我们block缺少一个名字,那我们就修改一下index.html文件:
{% extends "home.html" %}
{% block content %}
<h1>Helo,World!</h1>
{% endblock %}
然后再次刷新一下我们的页面,发现还是出了问题:
错误提示我们没有找到home.html页面,那是因为我们的路径出了问题,我们继续修改一下:
{% extends "home/home.html" %}
{% block content %}
<h1>Helo,World!</h1>
{% endblock %}
接着我们再次刷新一下,页面正常显示了:
会员登录页面搭建
打开app/home/views.py文件,新建以下代码:
from flask import redirect, url_for
# 登入
@home.route('/login/')
def login():
return render_template("home/login.html")
# 登出
@home.route('/logout/')
def logout():
return redirect(url_for('home.login'))
然后在templates/home下面新建login.html文件,往里面新增如下代码:
{% extends 'home/home.html' %}
{% block content %}
<div class="row">
<div class="col-md-4 col-md-offset-4">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><span class="glyphicon glyphicon-log-in"></span> 会员登录</h3>
</div>
<div class="panel-body">
<form role="form">
<fieldset>
<div class="form-group">
<label for="input_contact"><span class="glyphicon glyphicon-user"></span> 账号</label>
<input id="input_contact" class="form-control input-lg" placeholder="用户名/邮箱/手机号码" name="contact" type="text" autofocus>
</div>
<div class="col-md-12" id="error_contact"></div>
<div class="form-group">
<label for="input_password"><span class="glyphicon glyphicon-lock"></span> 密码</label>
<input id="input_password" class="form-control input-lg" placeholder="密码" name="password" type="password" value="">
</div>
<div class="col-md-12" id="error_password"></div>
<a href="user.html" class="btn btn-lg btn-success btn-block">登录</a>
</fieldset>
</form>
</div>
</div>
</div>
</div>
{% endblock %}
(这段代码来自tpl/2-movie/login.html里面<div class="container" style="margin-top:120px"> 内容</div>的内容部分)
会员注册
打开app/home/views.py文件,新建以下代码:
# 会员注册
@home.route('/register/')
def register():
return render_template("home/register.html")
然后在templates/home下面新建register.html文件,往里面新增如下代码:
{% extends 'home/home.html' %}
{% block content %}
<div class="row">
<div class="col-md-4 col-md-offset-4">
<div class="panel panel-success">
<div class="panel-heading">
<h3 class="panel-title"><span class="glyphicon glyphicon-plus"></span> 会员注册</h3>
</div>
<div class="panel-body">
<form role="form">
<fieldset>
<div class="form-group">
<label for="input_name"><span class="glyphicon glyphicon-user"></span> 昵称</label>
<input id="input_name" class="form-control input-lg" placeholder="昵称" name="name" type="text" autofocus>
</div>
<div class="col-md-12" id="error_name"></div>
<div class="form-group">
<label for="input_email"><span class="glyphicon glyphicon-envelope"></span> 邮箱</label>
<input id="input_email" class="form-control input-lg" placeholder="邮箱" name="email" type="email" autofocus>
</div>
<div class="col-md-12" id="error_email"></div>
<div class="form-group">
<label for="input_phone"><span class="glyphicon glyphicon-phone"></span> 手机</label>
<input id="input_phone" class="form-control input-lg" placeholder="手机" name="phone" type="text" autofocus>
</div>
<div class="col-md-12" id="error_phone"></div>
<div class="form-group">
<label for="input_password"><span class="glyphicon glyphicon-lock"></span> 密码</label>
<input id="input_password" class="form-control input-lg" placeholder="密码" name="password" type="password" value="">
</div>
<div class="col-md-12" id="error_password"></div>
<div class="form-group">
<label for="input_repassword"><span class="glyphicon glyphicon-lock"></span> 确认密码</label>
<input id="input_repassword" class="form-control input-lg" placeholder="确认密码" name="repassword" type="password" value="">
</div>
<div class="col-md-12" id="error_repassword"></div>
<a href="user.html" class="btn btn-lg btn-success btn-block">注册</a>
</fieldset>
</form>
</div>
</div>
</div>
</div>
{% endblock %}
(这段代码来自tpl/2-movie/register.html里面<div class="container" style="margin-top:120px"> 内容</div>的内容部分)
然后打开home/home.html文件,修改我们的url跳转链接:
会员中心页面搭建
由于前面已经有过2个页面搭建的例子,所以这里我们先定义完所以的路由,再在home文件夹里面新建对应的html文件!打开app/home/views.py文件,新建以下代码:
# 会员中心
@home.route('/user/')
def user():
return render_template("home/user.html")
# 修改密码
@home.route('/pwd/')
def pwd():
return render_template("home/pwd.html")
# 评论记录
@home.route('/comments/')
def comments():
return render_template("home/comments.html")
# 登入日志
@home.route('/loginlog/')
def loginlog():
return render_template("home/loginlog.html")
# 收藏电影
@home.route('/moviecol/')
def moviecol():
return render_template("home/moviecol.html")
就是这个样子:
接下来定义会员中心菜单栏页面,在home文件夹里面,新建menu.html文件,里面写入从tpl/2-movie/user.html页面中<div class="col-md-3"> </div>的部分,并且修改一下url的跳转问题:
<div class="col-md-3">
<div class="list-group">
<a href="{{ url_for('home.user') }}" class="list-group-item active">
<span class="glyphicon glyphicon-user"></span> 会员中心
</a>
<a href="{{ url_for('home.pwd') }}" class="list-group-item">
<span class="glyphicon glyphicon-lock"></span> 修改密码
</a>
<a href="{{ url_for('home.comments') }}" class="list-group-item">
<span class="glyphicon glyphicon-comment"></span> 评论记录
</a>
<a href="{{ url_for('home.loginlog') }}" class="list-group-item">
<span class="glyphicon glyphicon-calendar"></span> 登录日志
</a>
<a href="{{ url_for('home.moviecol') }}" class="list-group-item">
<span class="glyphicon glyphicon-heart"></span> 收藏电影
</a>
</div>
</div>
user.html书写
现在开始书写我们的user.html文件,我们复制tpl/2-movie/user.html页面中<div class="col-md-9"> </div>的部分:
{% extends "home/home.html" %}
{% block content %}
<div class="col-md-9">
......
</div>
{% endblock %}
然后运行一下我们的manage.py文件,发现我们的个人中心页面出来了,但是菜单栏没有出现:
我们需要include我们之前定义的menu.html页面,修改我们的user.html文件:
{% extends "home/home.html" %}
{% block content %}
{% include "home/menu.html" %}
<div class="col-md-9">
......
</div>
{% endblock %}
再刷新一下我们的页面试试,发现菜单栏已经可以正常显示了:
接下来将home/home.html里面的style进行合并,再进行挖坑填坑操作:
<style>
.navbar-brand > img {
display: inline;
}
.media {
padding: 3px;
border: 1px solid #ccc
}
</style>
{% block css %}{% endblock %}
接着打开home/user.html页面,对原来页面的css样式进行挖坑填坑操作:
{% block css %}
<style>
.navbar-brand > img {
display: inline;
}
.col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 {
padding-right: 3px;
padding-left: 3px;
}
.media {
padding: 3px;
border: 1px solid #ccc
}
</style>
{% endblock %}
pwd.html的书写
现在开始书写我们的pwd.html文件,我们复制tpl/2-movie/pwd.html页面中<div class="col-md-9"> </div>的部分:
{% extends "home/home.html" %}
{% block css %}
<style>
.navbar-brand>img {
display: inline;
}
.col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9{
padding-right: 3px;
padding-left: 3px;
}
.media{
padding:3px;
border:1px solid #ccc
}
</style>
{% endblock %}
{% block content %}
{% include "home/menu.html" %}
<div class="col-md-9">
......
</div>
{% endblock %}
我们发现我们还没有判断选中状态,我们给menu.html的类加上一个ID,然后采用jQuery来进行判断:
<div class="col-md-3">
<div class="list-group">
<a id ="m-1" href="{{ url_for('home.user') }}" class="list-group-item">
<span class="glyphicon glyphicon-user"></span> 会员中心
</a>
<a id ="m-2" href="{{ url_for('home.pwd') }}" class="list-group-item">
<span class="glyphicon glyphicon-lock"></span> 修改密码
</a>
<a id ="m-3" href="{{ url_for('home.comments') }}" class="list-group-item">
<span class="glyphicon glyphicon-comment"></span> 评论记录
</a>
<a id ="m-4" href="{{ url_for('home.loginlog') }}" class="list-group-item">
<span class="glyphicon glyphicon-calendar"></span> 登录日志
</a>
<a id ="m-5" href="{{ url_for('home.moviecol') }}" class="list-group-item">
<span class="glyphicon glyphicon-heart"></span> 收藏电影
</a>
</div>
</div>
打开home.html页面,在底部新增js的挖坑填坑代码:
{% block js %} {% endblock %}
然后打开user.html页面,在底部新增如下代码:
{% block js %}
<script>
$(document).ready(function () {
$("#m-1").addClass("active");
});
</script>
{% endblock %}
我们顺便在pwd.html页面也加上类似的代码:
{% block js %}
<script>
$(document).ready(function () {
$("#m-2").addClass("active");
});
</script>
{% endblock %}
comments.html的书写
{% extends "home/home.html" %}
{% block css %}
<style>
.navbar-brand > img {
display: inline;
}
.col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 {
padding-right: 3px;
padding-left: 3px;
}
.media {
padding: 3px;
border: 1px solid #ccc
}
</style>
{% endblock %}
{% block content %}
{% include "home/menu.html" %}
<div class="col-md-9">
</div>
{% endblock %}
{% block js %}
<script>
$(document).ready(function () {
$("#m-3").addClass("active");
});
</script>
{% endblock %}
loginlog.html的书写
{% extends "home/home.html" %}
{% block css %}
<style>
.navbar-brand > img {
display: inline;
}
.col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 {
padding-right: 3px;
padding-left: 3px;
}
.media {
padding: 3px;
border: 1px solid #ccc
}
</style>
{% endblock %}
{% block content %}
{% include "home/menu.html" %}
<div class="col-md-9">
</div>
{% endblock %}
{% block js %}
<script>
$(document).ready(function () {
$("#m-4").addClass("active");
});
</script>
{% endblock %}
moviecol.html的书写
{% extends "home/home.html" %}
{% block css %}
<style>
.navbar-brand > img {
display: inline;
}
.col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 {
padding-right: 3px;
padding-left: 3px;
}
.media {
padding: 3px;
border: 1px solid #ccc
}
</style>
{% endblock %}
{% block content %}
{% include "home/menu.html" %}
<div class="col-md-9">
</div>
{% endblock %}
{% block js %}
<script>
$(document).ready(function () {
$("#m-5").addClass("active");
});
</script>
{% endblock %}
现在再来运行我们的manage.py文件,我们在浏览器地址栏里面输入http://127.0.0.1:5000/user/,然后回车,然后点击左侧的菜单栏,发现页面显示没有问题。最后来完善一下url的跳转,我们打开home/home.html页面,修改如下:
电影列表页面搭建
继续在我们的home/views.py文件里面新增以下代码:
# 首页
@home.route('/')
def index():
return render_template("home/index.html")
# 动画
@home.route('/animation/')
def animation():
return render_template("home/animation.html")
注意:因为在前面我们已经创建了一个index函数,所以我们需要把它们去掉,或者重写一个
做完这些自然就是在templates/home文件夹下面新建对应的index.html和animation.html页面。考虑到首页的独立性,我们也在templates/home文件夹下面新建一个layout.html页面,并同时将home/home.html文件里面的代码都拷贝进去,并且修改一下home/home.html,将内容部分进行挖坑填坑操作:
我们只留下前四个col-md-3,其余的col-md-3就都删除!
然后将tpl/1-index-animation/animation.html的代码复制到home/animation.html里面,接着在static文件下新建anim文件,把与animation有关的js,css,main-banner都复制进去,就是这个样子:然后我们回到templates/animation.html页面,修改我们的静态样式加载地址:
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='anmi/css/style.css') }}">
<img src="{{ url_for('static', filename='anmi/main_banner/big0020150102211033.jpg') }}" alt="">
<script type="text/javascript" src="{{ url_for('static', filename='anmi/js/jquery.js') }}"></script>
接着回到我们的home/index.html页面,我们进行animation的跳转链接配置:
<iframe class="wow fadeIn" width="100%" height="375px" frameborder=0 scrolling=no src="{{ url_for('home.animation') }}"></iframe>
还有对我们的列表进行for循环的读取:
最后运行一下我们的manage.py文件,发现样式和页面都正常显示了:
电影搜索页面搭建
老规矩,在home/views.py文件下面新增以下代码:
# 搜索页面
@home.route('/search/')
def search():
return render_template("home/search.html")
自然你就需要在templates/home文件夹下面新建一个search.html页面。
接下来就是search相关的url跳转的配置,home.html和layout.html页面都需要配置:
<a class="btn btn-default" href="{{ url_for('home.search') }}"><span class="glyphicon glyphicon-search"></span> 搜索</a>
<a class="btn btn-default" href="{{ url_for('home.search') }}"><span class="glyphicon glyphicon-search"></span> 搜索</a>
电影详情页面搭建
老规矩,在home/views.py文件下面新增以下代码:
# 详情页面
@home.route('/play/')
def play():
return render_template("home/play.html")
自然你就需要在templates/home文件夹下面新建一个play.html页面。
打开home/play.html页面,我们新建以下代码:然后对所以的静态文件进行访问配置,由于太多,这里就不一一说明了。
接下来对home/home.html页面所以的url进行跳转配置,还有搜索中的电影播放与收藏中的电影播放页面的跳转,这个很多,需要耐心一个个去查找,修改。
之后运行一下manage.py文件,发现页面跳转没有问题。
404页面的搭建
因为404页面是一个全局页面,所以我们需要在初始化文件里面写入,而不是在home这个应用里面(app/--init--.py文件):
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")
# 404页面
@app.errorhandler(404)
def page_not_found(error):
return render_template("home/404.html"), 404
自然你就需要在templates/home文件夹下面新建一个404.html页面。
然后把4-404.html页面的代码都拷贝进去,并修改页面的跳转和静态文件的加载样式:
<!doctype html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<title>消失在宇宙星空中的404页面</title>
<link href="{{ url_for('static', filename='404/404.css') }}" rel="stylesheet" type="text/css">
</head>
<body>
<!-- 代码 开始 -->
<div class="fullScreen" id="fullScreen">
<img class="rotating" src="{{ url_for('static', filename='404/spaceman.svg') }}">
<div class="pagenotfound-text">
<h1>迷失在太空中!</h1>
<h2><a href="{{ url_for('home.index') }}">返回首页</a></h2>
</div>
<canvas id="canvas2d"></canvas>
</div>
<script type="text/javascript" src="{{ url_for('static', filename='404/spaceman.svg') }}"></script>
<!-- 代码 结束 -->
</body>
</html>
然后刷新一下我们的页面,发现404页面可以正常显示出来。
至此,我们本篇关于前端首页搭建的介绍就到此为止了,感谢你的赏阅!
本篇笔记对应上传的仓库为:https://github.com/licheetools/movie对应第三篇。