网站访问工具网站检测器

news/2025/10/2 5:26:54/文章来源:
网站访问工具,网站检测器,重庆做石材的网站,jsp网站服务建设是什么Python学习之路-Flask项目:博客前台 前言 前一篇完成了项目开发前的所有准备工作#xff0c;本篇将完成整个博客的前台相关工作。 首页 前言 首页主要为我们提供各个分类入口已经按时间顺序的文章列表和列表排行等数据#xff0c;是进入博客中第一眼看到的#xff0c;接…Python学习之路-Flask项目:博客前台 前言 前一篇完成了项目开发前的所有准备工作本篇将完成整个博客的前台相关工作。 首页 前言 首页主要为我们提供各个分类入口已经按时间顺序的文章列表和列表排行等数据是进入博客中第一眼看到的接下来就来实现吧。 排行展示 前言 在请求根路由时去数据库查询按点击量排行的10条文章 后端实现 index_blu.route(/) def index():...# 获取点击排行数据blog_list Nonetry:blog_list Blog.query.order_by(Blog.clicks.desc()).limit(constants.CLICK_RANK_MAX_BLOG)except Exception as e:current_app.logger.error(e)click_blog_list []for blog in blog_list if blog_list else []:click_blog_list.append(blog.to_basic_dict())data {user_blog: user.to_dict() if user else None,click_blog_list: click_blog_list,}return render_template(blog/index.html, datadata)分类展示 前言 分类展示是将博客按我们想要的分类进行分割的一个关键部分需要我们通过分类将其展示出来。 后端实现 在请求根路由的时候去查询博客分类并默认设置第1个分类选中 index_blu.route(/) def index():...# 获取博客分类数据categories Category.query.all()# 定义列表保存分类数据categories_dicts []for category in enumerate(categories):# 拼接内容categories_dicts.append(category.to_dict())data {user_blog: user.to_dict() if user else None,click_blog_list: click_blog_list,categories: categories_dicts}return render_template(blog/index.html, datadata)文章列表 前言 文章列表是整个博客最重要的一部分当我们点击分类时需要去获取当前分类下的文章数据当我们点击标签时需要去获取当前标签下的文章数据。在展示的时候需要更新文章列表界面不需要整体页面刷新所以文章数据也使用 ajax 的方式去请求后台接口进行获取。 接口设计 URL/blog_list请求方式GET传入参数JSON格式参数 参数名类型是否必须参数说明cidstring是分类idpageint否页数不传即获取第1页per_pageint否每页多少条数据如果不传默认10条 返回类型JSON 参数名类型是否必须参数说明errnoint是错误码errmsgstring是错误信息cidstring是当前文章数据的分类idtotalPageint否总页数currentPageint否当前页数blogListlist否列表数据blogList.titlestring是标题blogList.sourcestring是来源blogList.digeststring是摘要blogList.create_timestring是时间blogList.index_image_urlstring是索引图 后端实现 在index/views.py中定义视图函数。在查询的时候如果用户分类id传0则不添加分类查询条件 index_blu.route(/bloglist) def get_blog_list():获取指定分类的博客列表:return: 包含文章列表的jsonify对象# 1. 获取参数args_dict request.argspage args_dict.get(p, 1)per_page args_dict.get(per_page, constants.HOME_PAGE_MAX_BLOG)category_id args_dict.get(cid, 1)# 2. 校验参数try:page int(page)per_page int(per_page)except Exception as e:current_app.logger.error(e)return jsonify(errnoRET.PARAMERR, errmsg参数错误)# 3. 查询数据并分页filters []# 如果分类id不为1那么添加分类id的过滤if category_id ! 1:filters.append(Blog.category_id category_id)try:paginate Blog.query.filter(*filters).order_by(Blog.create_time.desc()).paginate(page, per_page, False)# 获取查询出来的数据items paginate.items# 获取到总页数total_page paginate.pagescurrent_page paginate.pageexcept Exception as e:current_app.logger.error(e)return jsonify(errnoRET.DBERR, errmsg数据查询失败)blog_list []for blog in items:blog_list.append(blog.to_basic_dict())# 4. 返回数据return jsonify(errnoRET.OK, errmsgOK, totalPagetotal_page, currentPagecurrent_page, blogListblog_list, cidcategory_id)详情页 前言 博客详情页是整个博客的精髓所在我们需要完成基类模板抽取、使用装饰器的形式完成用户数据的查询并传递到视图函数中、查询博客详情页数据并使用模板语言进行数据的展示、写出文章评论的后端逻辑、写出文章点赞的后端逻辑等功能。 准备工作 博客详情页面的前端页面为 blog/detail.html创建博客详情页的模块blog并在该模块下创建视图函数存储的 py 文件 views.py 创建蓝图 from flask import Blueprintblog_blu Blueprint(blog, __name__, url_prefix/blog)from . import views注册蓝图 def create_app(config_name):...# 注册蓝图from blog.modules.index import index_bluapp.register_blueprint(index_blu)from blog.modules.passport import passport_bluapp.register_blueprint(passport_blu)from blog.modules.blog import blog_bluapp.register_blueprint(blog_blu)...return app提供文章详情页访问的视图函数将文章详情页界面移动到模板文件夹视图函数需要接受文章 id 作为参数以便后续查询文章详情数据 blog_blu.route(/int:blog_id) def blog_detail(blog_id):return render_template(blog/detail.html) 数据展示 文章内容数据查询文章数据并返回 blog_blu.route(/int:blog_id) user_login_data def blog_detail(blog_id):try:blog blog.query.get(blog_id)except Exception as e:current_app.logger.error(e)abort(404)if not blog:# 返回数据未找到的页面abort(404)blog.clicks 1data {blog: blog.to_dict(),user_blog: g.user.to_dict() if g.user else None,}return render_template(blog/detail.html, datadata)文章排行 查询文章点击量数据并返回 blog_blu.route(/int:blog_id) user_login_data def blog_detail(blog_id):...# 获取点击排行数据blog_list Nonetry:blog_list blog.query.order_by(blog.clicks.desc()).limit(constants.CLICK_RANK_MAX_blog)except Exception as e:current_app.logger.error(e)click_blog_list []for blog in blog_list if blog_list else []:click_blog_list.append(blog.to_basic_dict())data {blog: blog.to_dict(),click_blog_list: click_blog_list,user_blog: g.user.to_dict() if g.user else None,}return render_template(blog/detail.html, datadata)\文章评论 需求分析 用户如果在登录的情况下可以进行评论未登录点击评论弹出登录框。用户可以直接评论当前文章 后端实现 接口设计 URL/blog/blog_comment请求方式POST传入参数JSON格式参数 参数名类型是否必须参数说明blog_idint是文章idcommentstring是评论内容parent_idint否回复的评论的id 返回类型JSON 参数名类型是否必须参数说明errnoint是错误码errmsgstring是错误信息 代码实现 在 blog/views.py 文件中添加评论文章的视图函数 blog_blu.route(/blog_comment, methods[POST]) user_login_data def add_blog_comment():添加评论user g.userif not user:return jsonify(errnoRET.SESSIONERR, errmsg用户未登录)# 获取参数data_dict request.jsonblog_id data_dict.get(blog_id)comment_str data_dict.get(comment)parent_id data_dict.get(parent_id)if not all([blog_id, comment_str]):return jsonify(errnoRET.PARAMERR, errmsg参数不足)try:blog blog.query.get(blog_id)except Exception as e:current_app.logger.error(e)return jsonify(errnoRET.DBERR, errmsg查询数据失败)if not blog:return jsonify(errnoRET.NODATA, errmsg该文章不存在)# 初始化模型保存数据comment Comment()comment.user_id user.idcomment.blog_id blog_idcomment.content comment_strif parent_id:comment.parent_id parent_id# 保存到数据库try:db.session.add(comment)db.session.commit()except Exception as e:current_app.logger.error(e)return jsonify(errnoRET.DBERR, errmsg保存评论数据失败)# 返回响应return jsonify(errnoRET.OK, errmsg评论成功, datacomment.to_dict())文章评论列表 在文章详情的视图函数中添加查询当前文章评论的逻辑 blog_blu.route(/int:blog_id) user_login_data def blog_detail(blog_id):...# 获取当前文章的评论comments []try:comments Comment.query.filter(Comment.blog_id blog_id).order_by(Comment.create_time.desc()).all()except Exception as e:current_app.logger.error(e)comment_list []for item in comments:comment_dict item.to_dict()comment_list.append(comment_dict)is_collected False# 判断用户是否收藏过该文章if g.user:if blog in g.user.collection_blog:is_collected Truedata {blog: blog.to_dict(),click_blog_list: click_blog_list,is_collected: is_collected,user_blog: g.user.to_dict() if g.user else None,comments: comment_list}return render_template(blog/detail.html, datadata)评论点赞功能 需求分析 后端提供点赞和取消点赞功能当用户点击未点赞按钮执行点赞逻辑向后端发起点赞请求取消点赞则反之在文章显示完成之后底部评论会根据当前登录用户显示是否点赞图标 接口设计 URL/blog/comment_like请求方式POST传入参数JSON格式参数 参数名类型是否必须参数说明comment_idint是评论idblog_idint是文章idactionstring是点赞操作类型add(点赞)remove(取消点赞) 返回类型JSON 参数名类型是否必须参数说明errnoint是错误码errmsgstring是错误信息 后端代码实现 在 blog/views.py 中添加点赞/取消点赞视图函数 blog_blu.route(/comment_like, methods[POST]) user_login_data def set_comment_like():评论点赞if not g.user:return jsonify(errnoRET.SESSIONERR, errmsg用户未登录)# 获取参数comment_id request.json.get(comment_id)blog_id request.json.get(blog_id)action request.json.get(action)# 判断参数if not all([comment_id, blog_id, action]):return jsonify(errnoRET.PARAMERR, errmsg参数错误)if action not in (add, remove):return jsonify(errnoRET.PARAMERR, errmsg参数错误)# 查询评论数据try:comment Comment.query.get(comment_id)except Exception as e:current_app.logger.error(e)return jsonify(errnoRET.DBERR, errmsg查询数据失败)if not comment:return jsonify(errnoRET.NODATA, errmsg评论数据不存在)if action add:comment_like CommentLike.query.filter_by(comment_idcomment_id, user_idg.user.id).first()if not comment_like:comment_like CommentLike()comment_like.comment_id comment_idcomment_like.user_id g.user.iddb.session.add(comment_like)# 增加点赞条数comment.like_count 1else:# 删除点赞数据comment_like CommentLike.query.filter_by(comment_idcomment_id, user_idg.user.id).first()if comment_like:db.session.delete(comment_like)# 减小点赞条数comment.like_count - 1try:db.session.commit()except Exception as e:current_app.logger.error(e)db.session.rollback()return jsonify(errnoRET.DBERR, errmsg操作失败)return jsonify(errnoRET.OK, errmsg操作成功)404 页面 需求 在用户访问一些不存在网址的时候弹出404页面 实现逻辑 可以使用 app.errorhandle(code_or_exception) 装饰器 代码实现 将 static/blog/404.html 文件拖到 templates/blog/ 目录下并继承于基类模板 在 blog/__init__.py 文件中的 create_app 函数中添加以下逻辑 def create_app(config_name):...app.errorhandler(404)user_login_datadef page_not_found(_):user g.userdata {user_blog: user.to_dict() if user else None}return render_template(blog/404.html, datadata)return app在浏览器里面输入网址进行测试

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

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

相关文章

建设厅网站贵州人事考试信息网提供手机网站制作公司

目录 一、LiveData的基本使用1. 使用方式一2. 使用方式二3. 使用方式三 二、LiveData 去除黏性数据的方法1. 去除黏性的Java版本2. 去除黏性的Kotlin版本 一、LiveData的基本使用 1. 使用方式一 MyLiveData.kt package com.example.mylivedata.simple1import androidx.lifec…

如何查看网站开发源码宁波seo软件

$ clip < ~/.ssh/id_rsa.pubbash: /c/Users/UsersName/.ssh/id_rsa.pub: No such file or directoryStep 1、检查本机现有的SSH密钥检查~/.ssh看看是否有名为d_rsa.pub和id_dsa.pub的2个文件。如果你什么都没得到这些文件&#xff0c;转到 步骤2 ;否则&#xff0c;请跳到 …

进一步加强区门户网站建设管理办法网站建设 套餐

Google Breakpad是什么&#xff1f; 一个开源的多平台崩溃报告系统。 Google breakpad是一个非常实用的跨平台的崩溃转储和分析模块&#xff0c;它支持Windows&#xff0c;Linux和Mac和Solaris。由于他本身跨平台&#xff0c;所以很大程度上减少了我们在平台移植时的工作&#…

网站建设最新资讯上海网络营销上海网络推广

文章目录 由浅入深学习TapableTapable是什么Tapable的Hook分类同步和异步的 使用Sync*同步类型钩子基本使用bailLoopWaterfall Async*异步类型钩子ParallelSeries 由浅入深学习Tapable webpack有两个非常重要的类&#xff1a;Compiler和Compilation。他们通过注入插件的方式&a…

电信100m光纤做网站常州做上市公司律所

ctfshow的杂项签到题&#xff0c;下载压缩包之后里面有图片。 直接将图片用010editor打开&#xff0c;检索ctfshow可以看到答案。

网站主持人制作网站建设策划书总结

工业镜头是图像采集系统的重要光学设备。它的作用是将目标物体的像成在相机的感光面上。 一、工业镜头原理 镜头是对光线进行调制和变换&#xff0c;使目标能够成像到相机的感光芯片上。将不同折射率的硝材加工成高精度的曲面&#xff0c;再把这些曲面进行组合后设计成能够满…

郑州注册网站江东怎样优化seo

南邮杯CTF 文件包含 题目地址&#xff1a;asdf 点击后利用file函数对show.php进行文件利用 使用伪协议php://filter/readconvert.base64-encode/resourceindex.php访问index.php文件 base64解码后得到flag [极客大挑战 2019]Secret File 题目地址&#xff1a;BUUCTF在线评测 …

网站建设 保密wordpress文章权限

nuget 是.Net平台上的包管理器, 对于包的发布(打包 package)和消费(下载依赖管理)都有很好的支持, 本文仅仅关注消费端, nuget项目依赖定义格式 新版 nuget 和VS 2019 都推荐项目依赖采用 PackageReference 格式, 这种格式的依赖声明是放到 .csproj 项目文件中的, 之前是使用…

网站建设登录界面设计步骤百度网站登录入口

前言现在对于Docker容器的隔离性都有所了解了&#xff0c;但对容器IP地址的分配、容器间的访问等还是有点小疑问&#xff0c;如果容器的IP由于新启动导致变动&#xff0c;那又怎么才能保证原有业务不会被影响&#xff0c;这就和网络有挂钩了&#xff0c;接下来就大概说说。正文…

wordpress软件站模板网页设计是做什么

引言 JSON&#xff0c;作为一种轻量级的数据交换格式&#xff0c;因其易于人阅读和编写&#xff0c;同时也易于机器解析和生成&#xff0c;而被广泛应用于网络通信和配置文件中。在Java中&#xff0c;有两个强大的工具帮助咱们处理JSON数据——Jackson和Gson。这两个库各有千秋…

郑州金水区建设局网站如何打开用wordpress

类型 说明 后缀或前缀 示例 sbyte 有符号 8 位整数 y 86y 0b00000101y byte 无符号 8 位自然数 uy 86uy 0b00000101uy int16 有符号 16 位整数 s 86s uint16 无符号 16 位自然数 us 86us int int32 有符号 32 位整数 l none。 86 86l uint uint32 无符号 32 位自然数 u 或 ul 8…

网站优化是怎么做的网络推广方案下拉管家xiala11

一、需求 在执行 mvn clean package -Dmaven.test.skiptrue 后&#xff0c;生成的 jar 包带有自定义系统时间。 二、实现 方法一&#xff1a;使用自带属性&#xff08;不推荐&#xff09; 使用系统时间戳&#xff0c;但有一个问题&#xff0c;就是默认使用 UTC0 的时区。举例…

网站推广广告包装设计十大网站

前言&#xff1a;MySQL有很多的可视化管理工具&#xff0c;比如“mysql-workbench”和“sequel-pro-”。 现在我写MySQL的终端命令操作的文章&#xff0c;是想强化一下自己对于MySQL的理解&#xff0c;总会比使用图形化的理解透彻&#xff0c;因为我本来就比较喜欢写代码。同时…

德赞网站建设网站制作企业网站的设计公司

文章目录1. 题目2. 解题1. 题目 给定一个整数数组 nums &#xff0c;你可以对它进行一些操作。 每次操作中&#xff0c;选择任意一个 nums[i] &#xff0c;删除它并获得 nums[i] 的点数。之后&#xff0c;你必须删除每个等于 nums[i] - 1 或 nums[i] 1 的元素。 开始你拥有…

怎么做提卡密网站广东省造价工程信息网

作者&#xff1a;lesleyfootprint.network 数据源&#xff1a;Token Sector Dashboard ChatGPT 的热潮点燃了 AI 领域&#xff0c;AI 与区块链技术的融合成为市场关注的焦点。因为区块链的一个显著特征是它能够在链上安全地存储大量数据&#xff0c;这与 AI 模型对数据的密集…

佛山中小企业网站制作wordpress首页自定义广告位

出于MVVM学习的需要&#xff0c;复习下匿名方法和Lambda表达式&#xff0c;因为之前用的也比较少&#xff0c;所以用的也不是很熟练&#xff0c;Baidu下相关的知识&#xff0c;写了这个Demo&#xff0c;目标是用简单的方法展示这个怎么用。 这里偏重的和LINQ中的Lambda表达式 …

网站建设服务器介绍图片网站的类型

背景 1 工作需要&#xff0c;需要修改一个java的程序逻辑&#xff0c;之前都是用的frida修改的&#xff0c;但是现在的工作场景&#xff0c;重视效率&#xff0c;所以frida这种重工具被pass了&#xff0c;只能重新选其他工具&#xff0c;初始的时候是想用java本身的一些修改工…

双语网站建设报价营销与运营的区别

友情提示&#xff1a;全文13000多文字&#xff0c;预计阅读时间10-15分钟Spring Cloud Eureka作为常用的服务注册中心&#xff0c;我们有必要去了解其内在实现机制&#xff0c;这样出现问题的时候我们可以快速去定位问题。当我们搭建好Eureka Server服务注册中心并启动后&#…

广州达美网站建设wordpress黑帽插件

某项目中&#xff0c;我要给别人封装一个深度学习算法的SDK接口&#xff0c;运行在RK3588平台上&#xff0c;然后客户给我的交叉编译工具链是 然后我用他们给我的交叉编译工具链报下面的错误&#xff1a; aarch64-buildroot-linux-gnu-gcc --version /data/chw/aarch64/bin/cca…

免费建站网页无需登陆广西新狐网络科技有限公司

在主要课程学完并确定论文题目后&#xff0c;研究生撰写论文的时间为一年半至两年。(一)论文选题的要求1. 选题必须有一定的理论意义或应用价值论文选题必须对国民经济建设或在学术上有一定的价值。2&#xff0e;国内外研究动态论文选题时&#xff0c;学生必须掌握与该课题有关…