专栏首页小闫笔记项目阶段之flask(三)

项目阶段之flask(三)

1.分页切换调试

2.新闻蓝图创建

目的:创建新闻蓝图对象管理新闻页面

操作流程:蓝图使用三部曲(创建蓝图对象,装饰视图函数,注册到app中)

因为这一部分是独立于首页和认证蓝图的,因此我们为其单独建立一个包news,实现高内聚,低耦合.

3.新闻详情页数据展示

将详情页面也在templates下的news中

然后我们在新闻包中添加一个专门处理新闻详情页面数据展示的视图函数

下面是接口文档:

请求路径

请求方式

请求参数

返回值

/news/<int:news_id>

GET

news_id

detail.html页面, 用户data字典数据

操作流程:

1/根据新闻编号,查询新闻对象

2/如果新闻对象不存在,直接抛出异常abort,后面我们会统一处理这些异常

3/携带数据取渲染页面

4/在news/detail.html中我们利用小胡子语法填充数据,替换掉死数据

4.基类base模板抽取

templates文件夹下一共有两个文件,一个首页页面,一个详情页面,为了简化代码,是我们的代码更加灵活,我们使用继承.将公共的部分抽取出来,写死在基类中,然后每个页面不同的部分我们只需要利用{% block %}将其预留出来,供其他页面继承后进行单独的重写即可.继承的时候,我们可以将页面中所有的数据进行一个清空处理了,然后再开头写{% extends '父模板' %}然后哪些部分不一样,我们直接利用block进行重写即可.

首页:

1/重写title部分

2/重写script部分

3/重写header部分

4/重写新闻列表部分

新闻详情页面:1/重写title部分

2/重写script部分

3/重写正文的部分

4/重写作者部分

5/获取用户点击量最多的前六条新闻

5.语法扫盲,g对象

陌生语法两点补充:

1/python中的三元运算

"语句1" if 条件A else "语句2"

执行特点:如果条件A成立,那么返回语句1,否则返回语句2

2/使用g对象配合装饰器使用

装饰器作用:给已经存在的方法,添加额外的功能,而不应该改变原有函数的结构

解决办法:不改变原有函数的结构,functools.wraps可以解决该问题

在框架中,给视图函数加了自定义的装饰器之后,再用@app.route("/index")添加索引,绑定路径,如果不使用wraps修饰函数,那么报错,提示"你添加路径的视图函数已经被绑定了其他路径"

小问题

1/session在存储的时候是存到了redis服务器中,因为我们在设置配置参数的时候就制定了 存储的redis服务器.

2/小括号也有提高优先级的作用

3/我们在设置快速代码块的时候,如果想要出现红色框(就是输入完成后,光标直接定位到我们需要填参数的地方)只需要在模板中,想要插入的部分加$name$即可

6.评论输入框的展示

我们需要做一个判断,就是跟胡用户的登录状态显示不同的输入框,如果是登录了直接显示评论框,如果是没有登录,显示登录的提示框.

7.收藏&取消收藏按钮展示

1/在后端中,我们需要判断用户是否收藏过该新闻

2/用户需要登录,并且该新闻在用户收藏过的新闻列表中

3/然后将信息返回给前台,前台给收藏&取消收藏的按钮,添加属性,是显示还是不显示

style="display: {% if data.is_collected %} none {% else %} block {% endif %}"

8.新闻收藏&取消收藏

思路分析:

1/判断用户是否登录了

2/获取参数

3/参数校验,为空校验

4/操作类型校验

5/根据新闻的编号取出新闻对象

6/判断新闻对象是否存在

7/根据操作类型["collect","cancel_collect"]进行收藏或者取消收藏

8/返回响应

9/前台将新闻的id进行取出展示

接口文档:

请求路径

请求方式

请求参数

返回值

/news/news_collect

POST

news_id,action, g.user

errno,errmsg

如果是不知道怎么打断点进行调试数据,那么按下面的规则来

前端中打断点,在两个地方:一个是在一个事件处,另一个是在回调函数处

后端中打断点是打在视图函数的第一行

9.使用登录装饰器封装用户数据

#定义登陆装饰器,封装用户的登陆数据
def user_login_data(view_func):
    @wraps(view_func)
    def wrapper(*args,**kwargs):
        # 1.从session中取出用户的user_id
        user_id = session.get("user_id")

        # 2通过user_id取出用户对象
        user = None
        if user_id:
            try:
                from info.models import User
                user = User.query.get(user_id)
            except Exception as e:
                current_app.logger.error(e)

        #3.将user数据封装到g对象
        g.user = user

        return view_func(*args,**kwargs)
    return wrapper

我们给需要取用户数据的视图函数都使用上面的装饰器即可@user_login_data

10.评论后端实现

操作思路:

1/判断用户是否登录

2/获取请求参数

3/校验参数,为空校验

4/根据新闻编号取出新闻对象,判断新闻是否存在

5/创建评论对象,设置其属性

6/保存评论对象到数据库中

7/返回响应,携带评论的数据

8/我们还需要将评论保存在数据库中,然后前台显示的时候,我们在后端要查询数据库,该新闻的所有评论

9/前台中,遍历所有的评论

接口文档:

请求路径

请求方式

请求参数

返回值

/news/news_comment

POST

news_id,comment,parent_id, g.user

errno,errmsg,评论字典

11.重点知识点图解

11.1前后端与前后端不分离的区别

11.2json和js对象的区别

11.3图片验证码

11.4短信验证码

11.5前端和后端进行交互,数据

优质文章推荐:

公众号使用指南

redis操作命令总结

前端中那些让你头疼的英文单词

Flask框架重点知识总结回顾

项目重点知识点详解

本文分享自微信公众号 - 全栈技术精选(Pythonnote),作者:小闫同学啊

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • flask_web网站收官

    首先恭喜我们的网站圆满完成,这么久终于大结局了,先小小的开心一下(放上网站的网址供大家查看:http://39.96.164.111,因为测试短信验证码的时候用...

    小闫同学啊
  • python技术面试题(一)

    If you change nothing, nothing will change

    小闫同学啊
  • 分布式id

    "Sometimes the questions are complicated and the answers are simple.—— Dr. Seuss...

    小闫同学啊
  • oracle 中start with ... connect by prior 子句的用法

    小小明童鞋
  • apiDoc构建源代码注释的接口文档 原

    本文档中的所有示例都使用Javadoc-Style(可用于C#,Go,Dart,Java,JavaScript,PHP,TypeScript和所有其他支持Jav...

    wuweixiang
  • SpringBoot非官方教程 | 第十一篇:springboot集成swagger2,构建优雅的Restful API

    swagger,中文“拽”的意思。它是一个功能强大的api框架,它的集成非常简单,不仅提供了在线文档的查阅,而且还提供了在线文档的测试。另外swagger很容易...

    方志朋
  • 5-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(配置保存数据的数据库)

    杨奉武
  • SDS会走上传统存储的老路么?

    正因为如此,软件定义存储被认为是解决传统存储问题的一副良剂。软件定义存储摆脱了专有硬件的束缚,以通用硬件为基础,以软件的方式让存储资源成为一个不受物理系统限制的...

    大数据在线
  • csv导入导出组件jcsv

    jcsv一个简单的、轻量级的csv导入、导出库,相对于opencsv与javacsv,jcsv侧重于导入导出,包括导入校验、导出模板等。 源代码地址:https...

    一笠风雨任生平
  • python 对象练习

      类型:决定对象可以保存什么类型的值,可进行什么样的操作,遵循什么样的规则。使用type()得到。

    用户2398817

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动