有几个网站如何做外贸海口网站公司

news/2025/9/23 12:15:31/文章来源:
有几个网站如何做外贸,海口网站公司,信宜市建设局网站,怎样注册网站卖东西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/912509.shtml

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

相关文章

学院实验室建设网站的好处高州市网站建设

导语:之前介绍了如何打包一个安卓安装包文件,如果想要上架安卓应用商店,那么就来这里学习一下方法吧。 目录 准备材料应用商店注册账号上架步骤审核事项 准备材料 基本信息 安装包:需要 32 或 64 位;包名&#xff…

网站维护更新费用品牌建设的重要性与意义

一、JavaScript的面向对象 JavaScript其实支持多种编程范式的,包括函数式编程和面向对象编程: JavaScript中的对象被设计成一组属性的无序集合,像是一个哈希表,有key和value组成;key是一个标识符名称,val…

项目管理软件开发案例seo 资料包怎么获得

学习笔记-SQL语法系统性学习,关卡式进阶 笔记参考:作者鱼皮 关卡式Sql语句学习体验网站 ,网站开源代码 如果想本地体验语法:1.下载大佬开源代码,运行前端项目(推荐); 2.或是自己使…

饮食类网站绿盒子网站建设案例

iPhone 不能下载第三方软件的原因主要是因为苹果公司严格控制其应用生态系统,确保所有应用都通过其官方的 App Store 分发。这有几个主要原因: 安全性:苹果公司希望通过这种方式减少恶意软件的传播,保护用户的隐私和数据安全。所…

使用Go语言实现高效定时任务功能

gofly.v1kf.com vx: llike620 ​ 在现代软件开发中,定时任务是许多系统不可或缺的一部分。无论是数据同步、定期通知还是资源清理,定时任务都能帮助我们自动化这些重复性工作。本文将介绍如何使用Go语言中的cron库实…

深入解析:GPT-5风波后,奥特曼深夜道歉并补偿!Plus用户成最大赢家,Wildcard 野卡停服后,普通人如何充值?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站开发有前途么北京网站建设公司华网天下优惠

目录 1. redis下载 2. 环境准备 3. redis部署 3.1 修改系统配置文件 3.2 开放端口 3.3 安装 redis 3.4 验证 本文将以三台服务器为例,介绍在 linux 系统下redis的部署方式。 1. redis下载 下载地址:Index of /releases/ 选择需要的介质下载&am…

保靖网站建设微商代理怎么找货源

一、flask对于简单搭建一个基于python语言-的web项目非常简单 二、项目目录 示例代码 git路径 三、代码介绍 1、安装pip依赖 通过pip插入数据驱动依赖pip install flask-sqlalchemy 和 pip install pymysql 2.配置数据源 config.py DIALECT mysql DRIVER pymysql USERN…

网站关键词快速排名工具wordpress 显示全文

70.爬楼梯 70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2.…

有做二手厨房设备的网站吗wordpress所有文章页面

拿到书的第二天就坐上了疫情期间的第一次飞机。。。飞机还延误了2个小时,有国外入境转机旅客搭乘了该趟航班,第一次觉得疫情离我这么近,不过还是坚持着到达了目的地,能做的只有带好口罩和手套。3个小时的飞行时间被拖到了5个小时&…

网站建设的用例图p站代理网址

在Debian 12系统中,要将系统语言和Man帮助手册设置为中文,需要执行以下步骤: 安装中文语言包: 首先,更新软件包列表并安装中文语言包。打开终端并运行以下命令: sudo apt update sudo apt install locales配…

沪深300指数怎么买seo技术手段

创建分类器 简介:分类是指利用数据的特性将其分类成若干类型的过程。分类与回归不同,回归的输出是实数。监督学习分类器就是用带标记的训练数 据建立一个模型,然后对未知的数据进行分类。分类器可以实现分类功能的任意算法,最简单…

wordpress 注册邮件设置密码win优化大师怎么样

在写邮件时,适当引用和参考可以使邮件更加准确、清晰和易于理解。以下是一些关于使用引用和参考的建议: 引用: 引用是在回复邮件时引用原始邮件的一部分或全部内容。这可以帮助读者回忆起之前的讨论内容,更好地理解当前的邮件。使…

徐州 商城网站建设wordpress批量发邮件

问题描述 在使用 Spring Boot 开发项目时,可能会遇到一个问题:点击运行按钮后,控制台没有任何输出,项目界面也没有显示。这种情况可能是由多种原因导致的,本文将介绍一些常见的解决方法。 解决方法 首先看下Groovy插…

完整教程:飞算JavaAI 2.0.0测评:自然语言编程如何颠覆传统开发?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

免费养殖网站模板各省网站备案时长

正则表达式 关于正则表达式,其实我写过几篇了,但是真正的正则表达式其实主要用于定义一些字符串的规则,计算机根据给出的正则表达式,来检查一个字符串是否符合规则。 我们来看一下,在JS中如何创建正则表达式对象。 语…

JavaScript获取NHK的附件文件

// 全自动下载PDF,使用class="label"的span文字作为文件名 (async function() {const table = document.querySelector("table.broadcastList__contents");if (!table) return;const pdfLinks = …

创建者模式:工厂方式模式

创建者模式:工厂方式模式2025-09-23 12:07 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

承兑 背书 贴现区别

承兑 背书 贴现区别 承兑、背书与贴现是票据业务中的三个重要概念,它们在票据的流通和融资过程中各自扮演着不同的角色。一、承兑承兑是指汇票付款人承诺在汇票到期日支付汇票金额的票据行为。根据《中华人民共和国票…

义乌制作网站建设网站公

第一范式: 属性不可分割:每个属性都是不可分割的原子项(实体的属性就是表中的列) 在上表中contact应该分为phone和adress两列 第二范式: 在满足第一范式的情况下,表中不存在部分依赖,非主键列…