Flask搭建新闻网站②

news/2024/5/9 23:38:49/文章来源:https://blog.csdn.net/weixin_43746433/article/details/105942641

文章目录

  • Day5
    • 404
    • 创建管理员
    • 管理员登录
    • 用户统计
    • 防止用户进入admin页面
    • gunicorn运行项目
    • nginx
  • Docker部署服务器
    • 建立docker镜像

Day5

在这里插入图片描述

404

# 统一返回404页面
@index_bp.route('/404')
@user_login_data
def page_not_found():data = {"user_info": g.user.to_dict() if g.user else ""}return render_template('news/404.html', data=data)

在这里插入图片描述

创建管理员

定义方法,创建管理员对象
@manager.option 给manager添加一个脚本运行的方法

python manager.py create_superuser -u 账号 -p 密码
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from flask import current_app# 导入models的作用是让整个应用程序知道有models的存在
from info import create_app, db, models
from info.models import Userapp = create_app('develop')# 创建manager对象, 管理app
manager = Manager(app)# 使用Migrate 关联app, db
Migrate(app, db)# 给manager 添加一条操作命令
manager.add_command("db", MigrateCommand)# 定义方法,创建管理员对象
# @manager.option 给manager添加一个脚本运行的方法
# 参数1:在调用方法的时候传递的参数名称
# 参数2:对参数1的解释
# 参数3:目的参数,用户传递给形式参数使用
@manager.option('-u', '--username', dest='username')
@manager.option('-p', '--password', dest='password')
def create_superuser(username, password):# 1.创建用户对象admin = User()# 2.设置用户属性admin.nick_name = usernameadmin.mobile = usernameadmin.password = passwordadmin.is_admin = True# 3.保存到数据库try:db.session.add(admin)db.session.commit()except Exception as e:current_app.logger.error(e)return '创建失败'return '创建成功'if __name__ == '__main__':manager.run()

管理员登录

# 获取/登陆,管理员登陆
# 请求路径: /admin/login
# 请求方式: GET,POST
# 请求参数:GET,无, POST,username,password
# 返回值: GET渲染login.html页面, POST,login.html页面,errmsg
@admin_bp.route('/login', methods=['GET', 'POST'])
def admin_login():# 1.判断请求方式,如果是GET,直接渲染页面if request.method == 'GET':# 判断管理员是否已经登录过了,如果登录了直接跳转到首页if session.get('is_admin'):return redirect('/admin/index')return render_template('admin/login.html')# 2.如果是POST请求,获取参数username = request.form.get('username')password = request.form.get('password')# 3.为空校验if not all([username, password]):return render_template('admin/login.html', errmsg='参数不全')# 4.根据用户名取出管理员对象,判断管理员是否存在try:admin = User.query.filter(User.mobile == username,User.is_admin == True).first()except Exception as e:current_app.logger.error(e)return render_template('admin/login.html', errmsg='用户查询失败')if not admin:return render_template('admin/login.html', errmsg='管理员不存在')# 5.判断管理员的密码是否正确if not admin.check_password(password):return render_template('admin/login.html', errmsg='密码错误')# 6.管理员的session信息记录session['user_id'] = admin.idsession['is_admin'] = True# 7.重定向到首页展示return redirect('/admin/index')

用户统计

# 用户统计
# 请求路径: /admin/user_count
# 请求方式: GET
# 请求参数: 无
# 返回值:渲染页面user_count.html,字典数据
@admin_bp.route('/user_count')
def user_count():# 1.获取用户总数try:total_count = User.query.filter(User.is_admin == False).count()except Exception as e:current_app.logger.error(e)return render_template("admin/user_count.html",errmsg="获取总人数失败")#2.获取月活人数localtime = time.localtime()try:#2.1先获取本月的1号的0点的, 字符串数据month_start_time_str = "%s-%s-01"%(localtime.tm_year,localtime.tm_mon)#2.2根据字符串,格式化日期对象month_start_time_date = datetime.strptime(month_start_time_str,"%Y-%m-%d")#2.3最后一次登陆的时间大于,本月的1号的0点钟的人数month_count = User.query.filter(User.last_login >= month_start_time_date,User.is_admin == False).count()except Exception as e:current_app.logger.error(e)return render_template("admin/user_count.html", errmsg="获取月活人数失败")#3.获取日活人数try:# 2.1先获取本日的0点, 字符串数据day_start_time_str = "%s-%s-%s" % (localtime.tm_year, localtime.tm_mon,localtime.tm_mday)# 2.2根据字符串,格式化日期对象day_start_time_date = datetime.strptime(day_start_time_str, "%Y-%m-%d")# 2.3最后一次登陆的时间大于,本日0点钟的人数day_count = User.query.filter(User.last_login >= day_start_time_date,User.is_admin == False).count()except Exception as e:current_app.logger.error(e)return render_template("admin/user_count.html", errmsg="获取日活人数失败")#4.获取活跃时间段内,对应的活跃人数active_date = []  # 获取活跃的日期active_count = []  # 获取活跃的人数for i in range(0,31):# 当天开始时间Abegin_date = day_start_time_date - timedelta(days=i)# 当天开始时间, 的后⼀一天Bend_date = day_start_time_date - timedelta(days=i - 1)# 添加当天开始时间字符串串到, 活跃⽇日期中active_date.append(begin_date.strftime("%Y-%m-%d"))# 查询时间A到B这⼀一天的注册⼈人数everyday_active_count = User.query.filter(User.is_admin == False,User.last_login >=begin_date,User.last_login<=end_date).count()# 添加当天注册⼈人数到,获取数量量中active_count.append(everyday_active_count)#为了图表显示方便,将容器反转active_count.reverse()active_date.reverse()#5.携带数据渲染页面data = {"total_count":total_count,"month_count":month_count,"day_count":day_count,"active_date":active_date,"active_count":active_count}return render_template("admin/user_count.html",data=data)

在这里插入图片描述
前端

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>新经资讯后台管理</title><link rel="stylesheet" type="text/css" href="../../static/admin/css/reset.css"><link rel="stylesheet" type="text/css" href="../../static/admin/css/main.css"><script type="text/javascript" src="../../static/admin/js/echarts.min.js"></script>
</head>
<body><div class="breadcrub">当前位置:用户管理>用户统计</div><div class="spannels"><div class="spannel scolor01"><em>{{ data.total_count }}</em><span></span><b>用户总数</b></div><div class="spannel scolor02"><em>{{ data.month_count }}</em><span></span><b>用户月活数</b></div><div class="spannel2 scolor03"><em>{{ data.day_count }}</em><span></span><b>用户日活数</b></div></div><div class="pannel"><div id="chart_show" class="chart_show"></div></div><script>var oChart = echarts.init(document.getElementById('chart_show'));var chartopt = {title:{text: '用户登录活跃数',left: 'center',top: '10'},tooltip:{trigger: 'axis'},legend: {data:['active'],top: '40'},toolbox: {show : true,feature : {mark : {show: true},dataView : {show: true, readOnly: false},magicType : {show: true, type: ['line','bar']},restore : {show: true},saveAsImage : {show: true}}},calculable : true,xAxis : [{name: '今天',type : 'category',boundaryGap : false,{#data : ["08:15","09:15","10:15","11:15","12:15","13:15","14:15","15:15","16:15","17:15","18:15","19:15"]#}data : {{ data.active_date | safe}}}],yAxis : [{name: '活跃用户数量',type : 'value'}],series : [{name:'active',type:'line',smooth:true,itemStyle: {normal: {areaStyle: {type: 'default'}, color: '#f80'}, lineStyle: {color: '#f80'}},{#data:[14951,14861,7186,15861,14951,14861,7186,14951,14861,7186,15861,14951]#}data:{{ data.active_count }}}],areaStyle:{normal:{color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{offset: 0,color: 'rgba(0,255,0,0.8)'}, {offset: .34,color: 'rgba(255,180,0,0.25)'},{offset: 1,color: 'rgba(255,0,0,1.00)'}])}}};oChart.setOption(chartopt);</script>
</body>
</html>

防止用户进入admin页面

admin/init.py

# 使用请求钩子,拦截用户的请求,只有访问了admin_bp,所装饰的视图函数需要拦截
# 1.拦截的是访问了非登录页面
# 2.拦截的是普通用户
@admin_bp.before_request
def before_request():# 判断访问的是否是非登录页面if not request.url.endswith('/admin/login'):if not session.get('is_admin'):return redirect('/')

在这里插入图片描述
在这里插入图片描述

gunicorn运行项目

在这里插入图片描述

nginx

	upstream new{server 127.0.0.1:6001;}server {listen 6000;server_name  127.0.0.1;location / {proxy_pass http://new;}error_page   500 502 503 504  /50x.html;}

在这里插入图片描述
在这里插入图片描述

Docker部署服务器

用Navicat连接服务器的 MariDB 数据库,导入 .sql文件失败,在服务器上用 source 命令成功了, what???

建立docker镜像

  • docker build

    docker build -t information_flask .
    
  • docker run

    docker run -itd --net=host --name information information_flask
    

在这里插入图片描述

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

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

相关文章

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月…

来膜拜下 Google 的全球化网站架构

这是 Google SRE 工程师在2018年5月的一篇分享。本文大致的介绍了 Google 整个网站的 infrastructure&#xff0c;以及代码发布流程。而更详细的细节&#xff0c;可以阅读 Google 出的《Site Reliability Engineering》这本书。原视频 Google Tech Talk 的链接&#xff1a;http…

因在公司上不正经网站,我没过试用期…

本文转载自程序员石头&#xff0c;作者 石头哥 最近浏览到一个知乎问题&#xff1a;某运营同学在试用期期间因为在工作期间上了某个网站&#xff0c;导致试用期不过。 前两天还看到不少推文&#xff0c;大意是&#xff1a;看小电影前一定要注意网址是不是 HTTPS 的&#xff0c;…