基于Python电影网站系统的日志

news/2024/5/10 1:11:30/文章来源:https://blog.csdn.net/weixin_43746433/article/details/102761251

文章目录

    • 使用技术:
    • 模块
      • 10.18
      • 10.19
      • 10.26
      • 10.27
      • 11.16
      • 11.17
      • 12.25
      • 12.26
        • 9-1上映预告-标签筛选-电影分页
        • 9-2 电影搜索-电影详情
        • 5-4 会员-收藏-评论管理页面搭建
        • 6-8 修改密码
        • 6-9 日志管理
      • 1.1
    • 遇到的问题
      • 1. 当验证在Flask中失败时,如何覆盖html默认的“请填写此字段”?
      • 2. ValueError: View function did not return a response
      • 3. nginx 限制ip并发 及速率

由于自己目前还在实习上班中,只能周末抽空做毕设,之前用Python做过Flask框架的教务系统,有一些经验,所以偷懒选用Flask框架做了一个简单的视频网站,如果有时间的话可以弄一个推荐算法在里面,做一步算一步吧!
自己写点日志记录下项目过程吧!
具体详情放在自己搭的博客上面了: 传送门

使用技术:

Python MTV模型
Flask微内核
Flask扩展插件配置及使用方法
根据业务开发网站前后台功能
Flask结合MySQL数据库
你将可以独立开发网站 独立部署运维网站
werkzug工具箱
pymysql数据库驱动
sqlalchemy数据库orm
wtforms表单验证工具
jinjia2模板引擎
flask-script命令行脚本
functools定义高阶函数
jwplayer播放器插件
视频限速限IP访问
flv、mp4视频格式支持
Nginx点播实现

模块

前台
会员登录及注册 / 会员中心 / 电影播放
电影评论 / 电影收藏

后台
管理员登录 / 修改密码 / 标签管理
电影管理 / 上映预告管理 / 会员管理
评论管理 / 收藏管理 / 角色管理
权限管理 / 管理员管理 / 日志管理

10.18

熟悉整个项目的部署,流程,以及所用到的库

10.19

使用flask的SQLAlchemy,创建Mysql数据库表,并创建了启动项目所需要前台home,后台admin,蓝图等等
部分mysql表
在这里插入图片描述
蓝图的建立
在这里插入图片描述

10.26

建立home.html 整个网站的框架,逐渐添加各种功能
在这里插入图片描述
电影:index.html

  • 由logout.html(负责电影首页类目类目)
  • animation.html(热映电影+轮播图)
  • 利用jinjia2的语法{% for v in range(1,13) %}构造电影信息列表

搜索:search.html 搜索页面
登录:login.html
注册:regist.html
退出:login.html
会员:user.html

  • 基于home.html

  • menu.html为会员中心的类目 id="m-*"为各种功能的id,每种功能js执行代码如下:

    <% block js %>
    <script>$(document).ready(function () {$("#m-4").addClass("active");})
    </script>
    <% endblock %>
    

10.27

前端
404.html 报错页面
play.html 电影播放页面 有bug 无法弹出播放列表,待修复
后端
admin.html 后台整体界面
gird.html 后台类目
login.html 管理员登陆页面

因为工作忙,好久没写项目了,今天补一下

11.16

admin.html 主模板,其余继承主模板,添加主模板的功能
5-1 管理员登录-后台布局搭建

  • 功能模块继承admin.gird.html 其各个功能需要添加id 定位,点击功能激活子功能

5-2 修改密码-控制面板-标签管理页面搭建

  • pwd.html,index.html,tag.html-tag_add.html

5-3 电影管理-上映预告管理页面搭建

  • movie_add.html,movie_add.html ,preview_list.html

5-4 会员-收藏-评论管理页面搭建

  • user_list.html,movie_col.html,comment_list.html

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

  • role_add,role_list.html
    5-6 管理员管理页面搭建
  • admin_add.html,admin_list.html

11.17

6-1 管理员登陆

  • 1.在model.py中添加check_pwd()函数,判断密码是否一致
  • 2.在form.py中添加表单需要的信息、是否存在账户。在view.py视图中调用,判断登录状态,登录失败,返回错误信息。登录成功,建立session并返回index.html中
def login():"""后台登录"""form = LoginForm()if form.validate_on_submit(): #表单数据data = form.dataadmin = Admin.query.filter_by(name=data["account"]).first()#查找adminif not admin.check_pwd(data['pwd']):flash("密码错误", "err")return redirect(url_for("admin.login"))session['admin'] = data['account']return redirect(request.args.get("next") or url_for("admin.index"))return render_template("admin/login.html", form=form)

访问控制,登录装饰器

def admin_log_req(f):"""登录装饰器"""@wraps(f)def decorated_function(*args, **kwargs):if "admin" not in session:return redirect(url_for("admin.login", next=request.url))return f(*args, **kwargs)return decorated_function

6-2 标签的添加与编辑

  • 添加标签、编辑
def tag_add():form = TagForm()print(form.name.errors)if form.validate_on_submit():data=form.datatag=Tag.query.filter_by(name=data["name"]).count()#数据库查找信息if tag==1:flash("名称已经存在!","err")return redirect(url_for('admin.tag_add'))tag=Tag(name=data["name"])db.session.add(tag)db.session.commit()flash("标签添加成功", "ok") #闪现消息redirect(url_for("admin.tag_add"))return render_template("admin/tag_add.html", form=form)
@admin.route("/tag/edit/<int:id>", methods=["GET", "POST"])
@admin_log_req
# @admin_auth
def tag_edit(id=None):"""标签编辑"""form = TagForm()form.submit.label.text = "修改"tag = Tag.query.get_or_404(id) #数据库依据id查找tagif form.validate_on_submit():data = form.datatag_count = Tag.query.filter_by(name=data["name"]).count()# 说明已经有这个标签了,此时向添加一个与其他标签重名的标签。if tag.name != data["name"] and tag_count == 1:flash("标签已存在", "err")return redirect(url_for("admin.tag_edit", id=tag.id))tag.name = data["name"]db.session.add(tag)db.session.commit()flash("标签修改成功", "ok")redirect(url_for("admin.tag_edit", id=tag.id))return render_template("admin/tag_edit.html", form=form, tag=tag)
  • for循环接收form表单、闪现消息
 {% for msg in get_flashed_messages(category_filter=["ok"]) %}
<div class="alert alert-success alert-dismissible"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button><h4><i class="icon fa fa-check"></i> 操作成功</h4>{{ msg }}</div>
{% endfor %}

6.3 标签列表的分页设置

#标签列表
@admin.route("/tag/list/<int:page>/", methods=["GET"])
@admin_log_req
def tag_list(page=None):if page is None:page=1page_data=Tag.query.order_by(Tag.addtime.desc() #按添加时间排序).paginate(page=page,per_page=10)return render_template("admin/tag_list.html",page_data=page_data)
{% macro page(data,url) -%}
<!--判断数据是否存在-->{% if data %}<ul class="pagination pagination-sm no-margin pull-right"><li><a href="{{ url_for(url,page=1) }}">首页</a></li>{% if data.has_prev %}
<!--                            data.prev_num 获取上一页页码--><li><a href="{{ url_for(url,page=data.prev_num) }}">上一页</a></li>{% else %}
<!--            没有上一页--><li class="disabled"><a href="#">上一页</a></li>{% endif %}
<!--            iter_pages() 页码生成器-->{% for v in data.iter_pages() %}{% if v %}{% if v == data.page %}<li class="active"><a href="#">{{ v }}</a></li>{% else %}<li><a href="{{ url_for(url,page=v) }}">{{ v }}</a></li>{% endif %}{% endif %}{% endfor %}<!--            下一页-->{% if data.has_next %}<li><a href="{{ url_for(url,page=data.next_num) }}">下一页</a></li>{% else %}<li class="disabled"><a href="#">下一页</a></li>{% endif %}<li><a href="{{ url_for(url,page=data.pages) }}">尾页</a></li></ul>{% endif %}
{%- endmacro %}

12.25

6.5

  1. 完善预告页面的增删
  2. 在编辑与删除成功时,自动删除原预告

12.26

9-1上映预告-标签筛选-电影分页

跳过其他管理员后台功能的完善,先完善前台页面与视频播放的模块,早些学习新知识。

  1. 完善home.index页面的搭建(分页)
  2. home.animation 轮播图的建立(有问题)!!!!!
  3. 电影列表的建立,以及筛选条件的完善
@home.route("/<int:page>/", methods=["GET"])
def index(page=None):"""首页电影列表"""tags = Tag.query.all()page_data = Movie.query# 标签tid = request.args.get("tid", 0)if int(tid) != 0:page_data = page_data.filter_by(tag_id=int(tid))# 星级star = request.args.get("star", 0)if int(star) != 0:page_data = page_data.filter_by(star=int(star))# 时间time = request.args.get("time", 0)if int(time) != 0:if int(time) == 1:page_data = page_data.order_by(Movie.addtime.desc())else:page_data = page_data.order_by(Movie.addtime.asc())# 播放量pm = request.args.get("pm", 0)if int(pm) != 0:if int(pm) == 1:page_data = page_data.order_by(Movie.playnum.desc())else:page_data = page_data.order_by(Movie.playnum.asc())# 评论量cm = request.args.get("cm", 0)if int(cm) != 0:if int(cm) == 1:page_data = page_data.order_by(Movie.commentnum.desc())else:page_data = page_data.order_by(Movie.commentnum.asc())if page is None:page = 1page_data = page_data.paginate(page=page, per_page=8) ## 为筛选后的电影列表p = dict(tid=tid,star=star,time=time,pm=pm,cm=cm,)return render_template("home/index.html", tags=tags, p=p, page_data=page_data)

9-2 电影搜索-电影详情

@home.route("/search/<int:page>/")
def search(page=None):"""搜索"""if page is None:page = 1key = request.args.get("key", "")  ## search 关键字movie_count = Movie.query.filter(Movie.title.ilike('%' + key + '%')).count()page_data = Movie.query.filter(Movie.title.ilike('%' + key + '%')).order_by(Movie.addtime.desc()).paginate(page=page, per_page=10)page_data.key = keyreturn render_template("home/search.html", movie_count=movie_count, key=key, page_data=page_data)

5-4 会员-收藏-评论管理页面搭建

@admin.route("/user/list/<int:page>/",methods=["GET", "POST"])
@admin_log_req
def user_list(page=None):"""会员列表"""if page is None:page = 1page_data = User.query.order_by(User.addtime.desc()).paginate(page=page, per_page=10)return render_template("admin/user_list.html", page_data=page_data)@admin.route("/user/view/<int:id>/",methods=["GET"])
@admin_log_req
def user_view(id=None):"""查看会员详情"""from_page = request.args.get('fp')if not from_page:from_page = 1user = User.query.get_or_404(int(id))return render_template("admin/user_view.html", user=user, from_page=from_page)@admin.route("/user/del/<int:id>/", methods=["GET"])
@admin_log_req
# @admin_auth
def user_del(id=None):"""删除会员"""# # # 因为删除当前页。假如是最后一页,这一页已经不见了。回不到。# from_page = int(request.args.get('fp')) - 1# # # 此处考虑全删完了,没法前挪的情况,0被视为false# if not from_page:#     from_page = 1user = User.query.get_or_404(int(id))db.session.delete(user)db.session.commit()flash("删除会员成功!", "ok")return redirect(url_for('admin.user_list', page=1))

6-8 修改密码

@admin.route("/pwd/", methods=["GET", "POST"])
@admin_log_req
def pwd():"""后台密码修改"""form = PwdForm()if form.validate_on_submit():data = form.dataadmin = Admin.query.filter_by(name=session["admin"]).first()from werkzeug.security import generate_password_hashadmin.pwd = generate_password_hash(data["new_pwd"])db.session.add(admin)db.session.commit()flash("修改密码成功,请重新登录!", "ok")return redirect(url_for('admin.logout'))return render_template("admin/pwd.html", form=form)

在form表单中验证密码的错误

    def validate_old_pwd(self, field):from flask import sessionpwd = field.dataname = session["admin"]admin = Admin.query.filter_by(name=name).first()if not admin.check_pwd(pwd):raise ValidationError("旧密码错误!")

6-9 日志管理

  • 管理员操作日志
 # 添加 管理员增加标签log
oplog = Oplog(admin_id=session["admin_id"],ip=request.remote_addr,reason="添加标签%s" % data["name"])db.session.add(oplog)db.session.commit()# 操作日志
@admin.route("/oplog/list/<int:page>", methods=["GET"])
@admin_log_req
def oplog_list(page=None):if page is None:page = 1page_data = Oplog.query.join(Admin).filter(Oplog.admin_id == Admin.id,).order_by(Oplog.addtime.desc()).paginate(page=page, per_page=10)return render_template("admin/oplog_list.html",page_data=page_data)
  • 管理员登录日志
    在管理员登陆时,插入登录日志
def login():"""后台登录"""form = LoginForm()if form.validate_on_submit():  # 表单数据data = form.dataadmin = Admin.query.filter_by(name=data["account"]).first()  # 查找adminif not admin.check_pwd(data['pwd']):flash("密码错误", "err")return redirect(url_for("admin.login"))session['admin'] = data['account']session["admin_id"] = admin.id #增加管理员id,用于管理员操作日志# 管理员登陆日志adminlog = Adminlog(admin_id=admin.id,ip=request.remote_addr, #获取ip)db.session.add(adminlog)db.session.commit()return redirect(request.args.get("next") or url_for("admin.index"))return render_template("admin/login.html", form=form)

1.1

完善前后端的优化工作,并部署到服务器

遇到的问题

1. 当验证在Flask中失败时,如何覆盖html默认的“请填写此字段”?

你应该让浏览器来处理这个问题,这些消息是标准的,并根据用户计算机的区域设置进行调整。有一个JavaScriptAPI来控制这些消息( ,尽管WTForms没有提供与它的任何集成(但是,扩展是一个好主意)。

  1. 如果你真的想要禁用这个,你可以通过required=False同时渲染一个字段。

    {{ form.name(required=False) }}
    
  2. 你可以通过重写整个窗体来禁用它。

    class NoRequiredForm(Form):class Meta:def render_field(self, field, render_kw):render_kw.setdefault('required', False)return super().render_field(field, render_kw)
    
  3. 你可以通过从禁用该窗体的基窗体继承它来禁用多个窗体。

    class UserForm(NoRequiredForm):
    

  4. 还可以通过设置novalidate属性在HTML上。

    <form novalidate></form>
    

2. ValueError: View function did not return a response

添加关键字return,视图无返回值

3. nginx 限制ip并发 及速率

https://blog.csdn.net/weixin_43746433/article/details/103897789

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_770939.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flask搭建新闻网站①

跟之前flask做的ihome租房网站类似&#xff0c;配置信息几乎完全一样&#xff0c;这里只记录下重点内容 git忽略log日志可在logs文件夹下加 .gitkeep文件 文章目录项目预览文章列表页文章详情页个人中心Day108_表结构分析数据库迁移显示网站logo文件Day2使用请求钩子自定义过滤…

Flask搭建新闻网站②

文章目录Day5404创建管理员管理员登录用户统计防止用户进入admin页面gunicorn运行项目nginxDocker部署服务器建立docker镜像Day5 404 # 统一返回404页面 index_bp.route(/404) user_login_data def page_not_found():data {"user_info": g.user.to_dict() if g.use…

Django+xadmin实现教育网站系统

文章目录环境配置与项目介绍Django升级2.0 注意的点app管理数据库设计注册model注册app目录5 xadmin搭建后台管理系统5-3 users app 的model注册5-5 xadmin全局配置app.py 定义app后台名称第6章 用户注册功能实现6.1 登录表单验证6-6 session和cookie自动登录机制用户注册发送邮…

Django+xadmin实现教育网站系统②

文章目录第10章 个人中心和全局搜索功能实现全局搜索修改头像第11章 首页、全局功能细节和404以及500页面配置第12章 常见web攻击及防范sql注入12-2 xss攻击原理及防范12-3 csrf攻击与防范第13章 xadmin的进阶开发13-1 userprofile注册以及django的权限管理13-3 model_icon, 只…

视频网站解决带宽问题(总结)

自己搜来的一些方案&#xff0c;汇总下供自己学习吧 1.大带宽是重中之重 所有了解视频类应用的人都知道&#xff0c;视频网站的带宽才是重中之重。在线视频播放网站每天都会产生巨额的流量&#xff0c;每个客户都会占据非常大的带宽。如果带宽不够就会出现用户播放卡顿&#…

php投票网站教程,PHP之投票联系

1.建立数据库表1&#xff1a;DiaoYanTiMu表2&#xff1a;DiaoYanXuanXiang2.页面页面1&#xff1a;投票首页无标题文档#fanhui{ display:none}$db new MySQLi("localhost","root","123","mydb");$sql "select * from diaoyanti…

网站页面左右_建设一个普通的网站需要多少钱?就是一个展示型的公司网站。...

这个问题在行业内是没有准确定义的&#xff0c;每一个建站公司在面对不同的客户需求&#xff0c;都会有不同的报价模式&#xff0c;而影响价格的因素有很多&#xff0c;但无疑建站成员所拥有的“宝贵经验”往往是最贵的&#xff0c;这也是建站公司相互报价差距巨大的原因。要想…

java页面加速_为你的网站加速

我的博客刚成立也是不久&#xff0c;所以现在我关注了很多中小博客站点&#xff0c;发现很多站点打开速度很慢&#xff0c;甚至有一些网站出现打不开的情况。网站运行不稳定&#xff0c;可能和使用的服务器有关系&#xff0c;因为很多人都图方便&#xff0c;为了不备案直接使用…

linux 重启命令nginxed,Nginx转发,部署网站相关linux命令

进入目录cd /etc/nginx/sites-available进入文件defaultsudo vim default;编辑a鼠标右键粘贴退出编辑Esc保存:wq重启Nginx服务sudo service nginx restart清空default里面的内容sudo sh -c encho "" >default创建manage-front文件&#xff0c;并复制cib-front到ma…

电子病历模板编辑器_这几个邮件模板网站,帮助提升工作效率

AUTOKLOSE: 一些免费的邮件正文模板。Autopilot Templates:ree customer journey templates for marketing automationBEE TEMPLATES for GMAIL: 可编辑Gmail邮件模板。COLD EMAIL TEMPLATE: 一系列营销邮件模板。Contactually: 不知道邮件内容怎么写&#xff1f;参考下这些邮件…

关于ssm框架的外文文献及译文_使用彩云小译,翻译外文网站实现双语对照

彩云小译扩展&#xff0c;实现外语网页的翻译功能&#xff0c;一段原文一段译文&#xff0c;让查阅外文资料可以随心所欲。整理&排版 | idea君 &#xff0c;预计阅读时间 | 3分钟 文章意在学习交流分享&#xff0c;如有侵权请联系删除 封面&#xff1a;http://www.pexels.c…

网站index.php怎么关联其余,thinkphp隐藏index.php/home并允许访问其他模块的实现方法...

想要达成的效果很简单&#xff0c;我有两个模块&#xff0c;Home、Wechat。http://localhost/index.php/home/index/index 缩短为&#xff1a; http://localhost/index/indexhttp://localhost/index.php/wechat/index/index 缩短为&#xff1a; http://localhost/wechat/index/…

php5.2.8升级,UWA2.X通用建站升级程序

UWA2.X通用建站升级程序是一款基于PHP和MySQL开发的通用建站系统&#xff0c;程序简洁、灵活而具备强大的扩展性&#xff0c;将是您轻松建站的首选利器。采用XML名字空间风格核心模板&#xff1a;模板全 部使用文件形式保存&#xff0c;对用户设计模板、网站升级转移均提供很大…

google android开发者网站,谷歌上线 Fuchsia OS 开发者网站

原标题&#xff1a;谷歌上线 Fuchsia OS 开发者网站谷歌自研的操作系统 Fuchsia OS 又有新动作了。据了解&#xff0c;谷歌近日悄悄地上线了 Fuchsia OS 的开发者网站 https://fuchsia.dev/。谷歌表示&#xff0c;上线 fuchsia.dev 是为了让开发者更好地参与 Fuchsia OS 的开发…

如何自制网页服务器,如何自己制作网站?如何制作自己的网页?

如何自己制作网站?如何制作自己的网页?首先&#xff0c;你是非开发者&#xff0c;你需要知道做一个网页要采取哪些步骤。下面一起来看看吧!简单来说&#xff0c;网页制作需要的内容如下:页面设计、前端开发、后端开发(如果只是简单的介绍页面或者是不经常更改的页面)&#xf…

我的世界服务器换披风的网站,我的世界正版披风怎么换|或

【我的世界评测】我的世界正版披风怎么换。那下面给大家分享的则是我的世界正版中更换披风的教程哦~那到底怎么更换披风呢&#xff1f;那下面就给大家详细的介绍一下吧&#xff01;如果你有心仪的作品或者心得分享的话&#xff0c;欢迎来游戏园投稿&#xff0c;大家可以点击>…

计算机安全可信站点,怎样看网站是否安全?教你从地址栏上分辨网站是否真安全...

当网民有SSL证书保护的加密页面时&#xff0c;地址栏网址也会由“http”自动变成“https”。如同金色安全锁标记一样&#xff0c;我们此时提交的信息得到了安全加密保护。不知道平时大家在日常上网时有没有发现观察过有的网站开头是http&#xff0c;而有的则是https。为何会有这…

帮程序员减压放松的 10 个良心网站

同学们工作之余&#xff0c;不妨放下微博跟朋友圈&#xff0c;来这10个网站感受一下看着就醉了的情境&#xff1a;「念完往上一推音乐键&#xff0c;我往后一靠&#xff0c;潮乎乎的软皮耳机里头&#xff0c;音乐排山倒海。」今天推荐的网站&#xff0c;利用代入感强的图片与音…

来,了解一下90年代的网站

来自&#xff1a;www.sohu.com/a/240853435_66877020 年对于互联网来说是很长的一段时间&#xff0c;网页设计在此期间也走过了很长的路&#xff0c;我们现在回头看&#xff0c;几乎不敢相信我们曾经设计过这种东西&#xff01;▎1. Penny JuicePenny Juice 是一款为儿童制作的…

网站 HTTP 升级 HTTPS 完全配置手册

作者&#xff1a;葡萄城技术团队链接&#xff1a;https://my.oschina.net/powertoolsteam/blog/1862967昨天&#xff0c;所有使用Google Chrome稳定版的用户迎来了v68正式版首个版本的发布&#xff0c;详细版本号为v68.0.3440.75&#xff0c;上一个正式版v67.0.3396.99发布于6月…