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.使用登录装饰器封装用户数据
1#定义登陆装饰器,封装用户的登陆数据 2def user_login_data(view_func): 3 @wraps(view_func) 4 def wrapper(*args,**kwargs): 5 # 1.从session中取出用户的user_id 6 user_id = session.get("user_id") 7 8 # 2通过user_id取出用户对象 9 user = None 10 if user_id: 11 try: 12 from info.models import User 13 user = User.query.get(user_id) 14 except Exception as e: 15 current_app.logger.error(e) 16 17 #3.将user数据封装到g对象 18 g.user = user 19 20 return view_func(*args,**kwargs) 21 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前端和后端进行交互,数据