DAY12 新闻详情页的相关渲染和用户登录状态校验封装

新闻详情页的相关渲染

在我们点击了首页的新闻标题之后就会跳转到一个URL

 

这个URL所展示页面就是我们渲染新闻详情页的页面,我们需要

新建一个视图来完成

首先根据地址,需要一个新的蓝图,且前缀为news,来到我们专门存放

视图的modules文件夹,然后新建一个Python文件夹news,并创建一个文件views

来存放我们的视图

 

 

 

 然后先在news的__init__.py创建我们的蓝图,创建好之后在app中注册使用,相关的代码说明前面有,这里就不细讲了,老

朋友了,放点截图意思意思。

 

 

 

 然后再views里先导入这个视图,之后创建我们的视图函数

 

 我们主页跳转的URL后面会有数字,那个是新闻的ID,我们通过js动态获取的数据自动生成了这个URL,所以

我们在设置视图的URL里面需要设置接收这个数字,用<>里面的变量名来接收,并进行整形的强转后作为形参给视图函数。然后进行

查询。我们只接收数字

建好视图之后,还是先写注释,函数实现的功能

 

 

 首先见我们的页面给渲染出去,然后再根据页面来进行分析,需要解决哪些问题,这里详情页面的HTML在我们之前的static里面

,我们将它移动到templates里面就可以了,还是放在我们的前端相关的news里

 

 完成之后先执行,然后点击新闻标题来到详情页

 

 

 

 通过查看我们发现获取用户登录状态和点击排行我们之前在处理主页面时都写过

从index的视图函数里把代码复制过来就行,红框就是我们的封装,后面讲

 前端HTML也别忘了修改,从index.html中对应的代码复制过来进行覆盖就行

完成之后就行新闻详情的渲染,也就是新闻相关。

我们需要通过从URL中接收到的新闻ID来进行查询

 

第三方数据库查询需要异常捕捉,其他的就和前面的查询没有什么区别,通过ID来获取对应的新闻

但是我们生成上下文时执行了类里的一个函数,它的作用就是将传入的对象的所有数据变成字典传

给前台,里面还可以加入一些我们没有的类属性,这个很重要。方便我们做数据的传输

 

 

函数里还对我们的数据格式也做了处理,这样直接使用就可以,不需要进行前台再转换,以及我们关联的表的数据进行获取,比如点赞数

将代码简化。

 

 

 完成之后,我们把前端的测试数据删掉,用模板引擎 的写法换上对应的新闻数据

在渲染内容时会发现出现了一堆标签,我们这里就需要我们模板引擎自带的过滤器safe来进行声明并让

浏览器进行渲染

 

 

 对应的替换内容查看单词就行

这样我们点击对应的新闻标题就是我们对应的内容,新闻详情渲染完成

 

 

 

 用户登录状态校验封装

 因为许多的操作需要校验我们的登录状态,也就是每一个对应的视图函数

里都需要使用和写入这个功能,我们可以通过创建装饰器来完成功能的添加

或者将这个部分封装成函数然后调用,这里我们将装饰器。

首先这也是一个我们自定义的工具,我们来到我们的自定义工具文件comment中我们自定义过滤器的后面来创建

代码为,里面执行的是我们获取session的并查询的代码,没有的包记得导入:

def user_login_data(func):
    def wrapper(*args,**kwargs):
        # 1. 获取用户登录状态
        # 1.1从session中获取user_id
        user_id = session.get("user_id")
        user = None  # 进行默认值的设置,防止数据库操作错误导致上下文里面没有变量而报错
        # 1.2利用user_id进行数据库查询,将查询到用户信息用变量进行保存
        try:
            user = User.query.filter_by(id=user_id).first()
        except Exception as e:
            current_app.logger.error(e)
            abort(404) 
        g.user = user    #g变量来保存我们的user
        return func(*args,**kwargs)
    return wrapperz

 

这里使用了g变量来保存我们查询的user,方便我们在视图函数中获取。

g 变量的说明:

g:global

  1. g对象是专门用来保存用户数据的
  2. g对象在一次请求中的所有的代码的地方,都是可以使用的
  3. g对象发送第二次请求时,便会失效

这样我们视图中获取用户的信息代码就变成了

# 1. 获取用户登录状态
    user = g.user

 

不论是在过滤器函数中或者视图函数中使用时都记得导入, 过滤器本身就是函数

所以我们需要先导入后再通过语法糖来进行视图函数的装饰使用

 

 

 

 新闻详情页的全部的代码为:

@news_blue.route("/detail/<int:news_id>")
@user_login_data
def detail(news_id):
    """
    新闻详情页渲染
    1.获取用户登录状态
        1.1从session中获取user_id
        1.2 利用user_id进行数据库查询,将查询到用户信息用变量进行保存
    2.点击排行新闻处理
        2.1 通过查询数据库获得点击量对多的前6条数据
    3.通过新闻ID获取详情
    :return: 
    """
# 1. 获取用户登录状态
    user = g.user
 # 2点击排行新闻处理
    # 2.1通过查询数据库获得点击量对多的前6条数据
    news_click_list = []
    try:
        news_click_list = News.query.order_by(News.clicks.desc()).limit(6)
    except Exception as e:
        current_app.logger.error(e)
    # print(news_id)
#3通过新闻ID获取详情
    news = None
    try:
        news = News.query.filter_by(id=news_id).first()
    except Exception as e :
            current_app.logger.error(e)
            abort(404)

# 生成保存用户变量的上下文并传到前台进行相关判断处理
    context = {
        "user": user,
        "news_click_list": news_click_list,
        "news":news.to_dict()
    }

    return render_template("news/detail.html", **context)

  

 

posted @ 2021-10-20 21:33  和风的夏天  阅读(73)  评论(0)    收藏  举报