Pythonweb开发之flask项⽬实战总结
在线问答系统
Flask Web开发
请求到响应
⽤户通过浏览器访问url,会发送请求到服务器,服务器接收请求后会根据url规则到对应的视图函数进⾏处理,处理完后会把结果发送到浏览器端,浏览器接收到返回的内容并呈现给⽤户(得到响应)。
上下⽂对象
在分派请求之前都会被激活,在请求处理完成后都被删除。
请求上下⽂对象:
Request:请求对象,封装了客户端发出的HTTP请求中的内容。
Session:⽤户会话(dict)。各请求之间的数据共享。
应⽤上下⽂对象:
current_app:当前激活程序的程序实例。
g:处理请求时的临时存储对象,每次请求都会重设这个变量
Session与cookie:
1. Session是在服务器端存储数据,⽽cookie是在客户端存储数据。
2. Session依赖于cookie实现,客户端向服务器端发送请求时会带上cookie,服务器端根据cookie的值到Session中对应的值(数据或
⽤户)。
请求报⽂:包括请求头和请求体
常⽤参数:
method:GET/POST
form:POST请求数据dict
args:GET请求数据dict
values:POST请求数据和GET请求数据集合dict
files:上传的⽂件数据dict
cookies:请求中cookie dict
headers:HTTP请求头
响应报⽂:包括响应头和响应体
响应:字符串,元组(response,status,headers)
响应元组:response-响应内容;status-响应状态码;headers-响应头信息(dict)。
项⽬介绍
该系统是基于Python的Web开发实战项⽬,前端框架采⽤Bootstrap,后端采⽤Flask框架,模板引擎为Jinja2,数据库采⽤Mysql8.0,开发环境为Python3.9,Flask2.0.1。
功能描述
该项⽬通过蓝图改造实现了项⽬模块化,主要分为⽤户模块和问答模块,⽤户模块包括登录、注册、个⼈主页。问答模块包括⾸页,关注页,详情页,写⽂章页。
⽤户可以登录,注册,并在个⼈主页查看和修改个⼈信息等。
⽤户可以发问题,关注问题,回答问题,也可以收藏回答,点赞回答,点赞评论,评论回答等。
⼀、前端设计
前端主要采⽤了HTML标签,CSS样式,JS语⾔。布局主要采⽤的是Flex布局和Bootstrap栅格布局,也⽤到了Bootstrap许多内置的全局CSS样式和组件以及JS插件,同时⽤到了iconfont阿⾥图标库,再加上⾃⼰对页⾯样式的改写和优化,这样下来,基本搭建了项⽬的前端页⾯。
⼆、数据库设计
使⽤flask_sqlalchemy扩展建⽴ORM模型,难点主要在对表之间关系的理解以及建⽴表与表的关系属性,常见的关系主要是⼀对⼀和⼀对多。
例如在UserProfile模型下建⽴与User模型⼀对⼀属性:
user = db.relationship('User', backref=db.backref('profile', uselist=False))
在Question模型下建⽴与User模型⼀对多属性:
user = db.relationship('User', backref=db.backref('question_list', lazy='dynamic'))
这⾥采⽤lazy=‘dynamic’(懒加载):不是直接加载这些数据,SQLAlchemy会返回⼀个查询对象,在加载数据前可以过滤(提取)它们,不可⽤在⼀对⼀和多对⼀关系中
三、页⾯功能开发
1.⽤户模块
该模块难点主要在登录,这⾥采⽤了第三⽅扩展flask_login。
登录流程:
1. ⽤户在登陆表单输⼊⽤户名和密码。
2. 表单验证包括验证⽤户名和密码是否正确,⽤户名规定为⼿机号,⽤户名和密码不为空,⽤户状态为激活状态等。
3. 通过表单验证,执⾏登录操作。
4. 记录⽤户登录信息。
5. 跳转到上⼀次访问的页⾯或⾸页。
开发流程:
1. 编写登录表单并渲染到模板中。
2. 编写表单验证,包括⾃定义表单验证,验证⽤户名和密码是否正确。注:由于数据库中的密码是加密存储,验证时需要拿到表单中的
⽤户名和密码,并将密码加密后再验证
3. 通过login_user()执⾏登录操作,可以记录、保存当前成功登录的⽤户(current_user)。
4. 使⽤ORM模型保存⽤户登录的相关信息到数据库中。
5. 登陆成功后重定向,这⾥添加了⼀个隐藏表单域⽤来保存⽤户上⼀次试图访问的页⾯url,并在视图函数中得到相应的值。
<input type="hidden" name="next" value="{{ next_url|d('') }}">
next_url = ('next', url_for('qa.index'))
部分效果展⽰:
2.问答模块
该模块难点主要在关注页⾯中问答列表的分页异步加载,详情页⾯中评论功能的开发和评论的分页异步加载等。接⼝使⽤restful风格接⼝,并通过Jquery中的ajax调⽤接⼝。
实现流程:
1. 后端(视图层)编写API
2. 前端(模板层)调⽤API
3. 渲染页⾯,绑定功能。
部分代码:
@qa.route('/qa/list')
def question_list():
"""异步查询问题数据列表"""
try:
bootstrap项目per_page =2
page = ('page',1,type=int)
lst =[]# ⽤来保存当前⽤户关注的问题id
# 只查询当前⽤户关注的问题
question_follow = QuestionFollow.query.filter_by(user_id=current_user.id).all() for item in question_follow:
lst.append(item.q_id)
page_data = Question.query.filter(Question.id.in_(lst)).paginate(page=page, per_page=per_page) data = render_template('qa_list.html', page_data=page_data)
return{'code':0,'data': data}
except Exception as e:
print(e)
data =''
return{'code':1,'data': data}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论