项目介绍

  • 首页:
  • 首页导航栏

首先是首页导航栏,当用户没有登录的时候首页导航栏会显示为

这是用户没有登录的情况 最右边会有登录和注册的按钮。当用户点击注册时,会跳转到注册页面。

当用户登录后。
最右边会显示用户的用户名,点击时有三个选项,下面会对这几个功能进行介绍,当用户点击个人中心时会跳转到个人信息的页面。

  • 注册功能
    需要用手机号进行注册,点击发送验证码的时候会出现倒计时,在一分钟之内完成注册内是手机验证码是有效的,要注册成功必须输入正确的短信验证码和图片验证码。点击立即注册即可完成用户的注册,之后会跳转到首页。首页导航条最右部分将会变成用户信息。
    注册页面和登录页面都是使用的同一个HTML模板。采用了flask中的jinjia2和模板继承{%extends %}的方法。
    因为需要用到get和post两种方法所以我们采用类视图的方法。
    其中我们通过request.referrer获取上一个跳转过来的页面,然后传递给html模板,最后通过js文件当注册完成时,跳转回上一个页面。当上一个页面不存在或者不满足安全要求或者就是当前页面时,跳转回首页。
class Signupview(views.MethodView):def get(self):return_to = request.referrerif return_to and return_to !=request.url and safeutils.is_safe_url(return_to):return  render_template('front/front_signup.html',return_to=return_to)else:return render_template('front/front_signup.html')def post(self):form = Signupform(request.form)if form.validate():telephone =form.telephone.datauser =Front_user.query.filter_by(telephone=telephone)if user:return restful.params_error('手机号已被注册!')else:username =form.username.datapassword =form.password1.datauser =Front_user(telephone=telephone,username=username,password=password)db.session.add(user)db.session.commit()session[config.front_user_id] = user.idreturn  restful.sucess()else:print(form.get_error())return  restful.params_error(message=form.get_error())

采用了ajax的方法发送请求。

使用了阿里大于进行短信发送,使用官方的发送短信验证码的API,进行信息的配置后,调用send_sms函数即可进行信息的发送。Captcha.是之前定义的一个类用来生成验证码和图形验证码,验证码是随机生成的。当点击发送验证码的时候会调用这个接口。经过form表单(进行了一定的加密作用 防止利用接口无限发送短信。采用POST请求)验证后提取数据通过memcache在内存中对短信验证码进行存储。默认60S后过期。如果没有验证成功将会出现提醒。

@bp.route('/sms_captcha/',methods=['POST'])
def sms_captcha():#手机号码  时间戳 md5(ts+tele+salt)form =Smscaptchaform(request.form)if form.validate():telephone =form.telephone.datacaptcha = Captcha.gene_text(number=6)result = alidayu.send_sms(131212330, telephone, "玉子论坛", "SMS_xxxxxx", {'code': captcha})if result:zlcache.set(telephone,captcha)return restful.sucess()else:return restful.params_error('短信验证码发送失败')else:return  restful.params_error(message='参数错误!')

图形验证码是使用PIL库进行制作的,调用其中的Image,ImageDraw,ImageFont方法来进行制作。当点击验证码的时候会对验证码进行一次刷新,使用JS来实现。同样通过通过memcache来对验证码再内存中进行缓存。

@bp.route('/captcha/')
def graph_captcha():text,image =Captcha.gene_graph_captcha()zlcache.set(text.lower(),text.lower())out =BytesIO()image.save(out,'png')out.seek(0)resp =make_response(out.read())resp.content_type ='image/png'return resp

我们创建了一个Front_user的ORM模型,当我们创建一个新的模型时,我们采用Flask-Migrate,Flask-Script,Manager处理SQLAlchemy 数据库迁移。当表单验证成功时,通过flask sqlalchemy的db.session对数据库进行写入的操作。完成用户的注册。

  • 登录功能
    当用户点击登录按钮时,将会跳转到登录页面。
    点击记住我会使cookie信息保留一个月,即使关闭浏览器,下次进入也会显示登录的状态。 点击左下角将会跳转到注册界面。点击右下角将会跳转到安全中心,通过手机验证码的方式来修改密码找回账号。(这个功能将会在下面进行介绍)。
    同样我们选取类视图的方法。同样也可以实现登录后跳转到上一个页面的功能。
class  SigninView(views.MethodView):def get(self):return_to =request.referrerif return_to and return_to != request.url and safeutils.is_safe_url(return_to) and return_to != url_for('front.signup'):return  render_template('front/front_signin.html',return_to=return_to)else:return render_template('front/front_signin.html')def post(self):form =Signinform(request.form)if form.validate():telephone = form.telephone.datapassword = form.password.dataremember =form.remember.datauser =Front_user.query.filter_by(telephone=telephone).first()if user and user.check_password(password):session[config.front_user_id] =user.idif remember:session.permanent =Truereturn  restful.sucess()else:return  restful.params_error(message='手机号或密码错误')else:return  restful.params_error(message=form.get_error())

我们通过表单验证的方法对登录进行判断,通过查询数据库的方法查找到用户,然后调用Front_user下面的check_password方法对密码是否正确进行判断。这里的代码是Front_user中对密码的进行的操作,在Front_user我们设置密码为_password,为了确定密码的安全,我们在对_password进行加密,使得在数据库中看不到直接的密码,当我们进行登录时使用下面的check_password方法将输入的密码与正确的密码对比,从而确定能否登陆成功。

 @propertydef password(self):return  self._password@password.setterdef password(self,newpwd):self._password =generate_password_hash(newpwd)def check_password(self,rawpwd):return  check_password_hash(self._password,rawpwd)


进入到这个页面后,可以修改信息。点击编辑信息,会弹出一个模态对话框。
然后可以通过修改来修改信息,点击添加头像时,会弹出

可以选择图片进行上传。上传头像这一块是使用的七牛云来进行对图片的上传。
编辑完信息点击保存将会刷新个人信息页面。显示修改后的信息。

当用户点击安全中心时,会跳转到修改密码/找回密码的界面(和登录时找回密码的网页一样)

通过手机验证码的方式来修改密码。
以上是对导航栏的功能的介绍

  • 首页轮播图


可以通过cms后台来设置轮播图(这一块会在cms后台的介绍中进行介绍)。点击图片会跳转到指定的网页,也是通过cms后台进行设置的,必须要有cms的账号且拥有权限才能进行设置。

  • 首页帖子和板块及选择功能介绍
@bp.route('/')
def index():board_id =request.args.get('bd',type=int,default=None)page = request.args.get(get_page_parameter(), type=int, default=1)sort =request.args.get('st',type=int,default=1)banners =Bannermodle.query.order_by(Bannermodle.priority.desc()).limit(4)boards =Boardmodle.query.all()start = (page - 1)*config.PER_PAGEend =start+config.PER_PAGEposts =Nonetotal =0if sort==1:query_obj =Postmodle.query.order_by(Postmodle.create_time.desc())elif sort==2:#按照加精的时间排序query_obj =db.session.query(Postmodle).outerjoin(Highlightpostmodle).order_by(Highlightpostmodle.create_time.desc(),Postmodle.create_time.desc())elif sort ==3:query_obj = db.session.query(Postmodle).outerjoin(Dianzanshumodle).group_by(Postmodle.id).order_by(func.count(Dianzanshumodle.id).desc(), Postmodle.create_time.desc())else:#按照评论最多排序query_obj =db.session.query(Postmodle).outerjoin(Commentmodle).group_by(Postmodle.id).order_by(func.count(Commentmodle.id).desc(),Postmodle.create_time.desc())if board_id:query_obj =Postmodle.query.filter_by(board_id =board_id)if sort == 1:query_obj = query_obj.order_by(Postmodle.create_time.desc())elif sort == 2:# 按照加精的时间排序query_obj = query_obj.outerjoin(Highlightpostmodle).order_by(Highlightpostmodle.create_time.desc(), Postmodle.create_time.desc())elif sort == 3:query_obj = query_obj.outerjoin(Dianzanshumodle).group_by(Postmodle.id).order_by(func.count(Dianzanshumodle.id).desc(), Postmodle.create_time.desc())else:# 按照评论最多排序query_obj = query_obj.outerjoin(Commentmodle).group_by(Postmodle.id).order_by(func.count(Commentmodle.id).desc(), Postmodle.create_time.desc())posts =query_obj.slice(start,end)total =query_obj.count()else:posts=query_obj.slice(start,end)total =query_obj.count()pagination =Pagination(bs_version=3,page=page,total=total,outer_window=0,inner_window=2)context ={'banners':banners,'boards':boards,'posts':posts,'pagination':pagination,'current_board':board_id,'current_sort':sort,}return render_template('front/front_index.html',**context)

这里进行帖子的展示。
当帖子数量超过10篇时将会进行分页,这部分的功能是通过flask_paginate来进行实现的。通过request.args.get的方法来获取当前的页数。使用start和end用切片操作来获取要显示的帖子。

板块是在CMS后台中添加的。可以通过选择板块来查找各个板块下的帖子。通过request.args.get来得到板块ID。然后通过数据库查询筛选出板块下的帖子。 query_obj =Postmodle.query.filter_by(board_id =board_id)

这里是板块选项。默认选项是所有版块将展示所有的帖子。
当选择其他的板块选项时会对帖子进行筛选。比如当选择FFXIV时 只会显示属于FFXIV板块的帖子。

可以结合下面图片中的选项进行筛选。创建四个sort来进行筛选,使用数据库查询的order_by和fitler_by来查询。涉及到两个模型的时候,不如点赞和精华帖子还要使用outerjoin。用group_by分组。

例如当我选择FFXIV和评论最多的选项时。

将会查询FFXIV板块下的帖子并且按照评论的数量进行排序。

  • 发布帖子的功能介绍
    当点击首页的发布帖子按钮时,页面将会跳转到

    可以进行帖子的编写,采用的是ueditor和七牛云进行实现的,可以选择帖子所属的板块,默认是第一个板块FFXIV。当发布帖子后,会出现提示框。
    首先创建一个帖子模型,接下来将模型映射到数据库中。再建立一个表单对前端传递进来的数据进行表单验证。发布帖子需要登录,使用一个装饰器来确定发布帖子时必须是登陆的。
def login_required(func):@wraps(func)def inner(*args,**kwargs):if config.front_user_id in session:return func(*args,**kwargs)else:return redirect(url_for('front.signin'))return  inner@bp.route('/apost/',methods=['GET','POST'])
@login_required
def apost():if request.method =='GET':boards =Boardmodle.query.all()return render_template('front/front_apost.html',boards=boards)else:form =Addpostform(request.form)if form.validate():title =form.title.datacontent =form.content.databoard_id =form.board_id.databoard =Boardmodle.query.get(board_id)if not  board:return  restful.params_error(message='没有这个版块!')post = Postmodle(title=title,content=content)post.board =boardpost.author =g.front_userdb.session.add(post)db.session.commit()return  restful.sucess()else:return restful.params_error(message=form.get_error())

表单验证成功后,会将帖子写入数据库中。

点击回到首页会跳转到首页,点击再发一篇会重新刷新页面。

  • 帖子详情页介绍
    当点开任意一篇首页的帖子
@bp.route('/p/<post_id>/')
def post_detail(post_id):post =Postmodle.query.get(post_id)comments =Commentmodle.query.filter_by()zans =Dianzanshumodle.query.filter_by(post_id =post_id).all()if not post:abort(404)return  render_template('front/front_pdetail.html',post=post,zans=zans)

通过数据库查询帖子,获得帖子信息
左边的大边框会显示帖子的内容,右边的小边框会显示作者的信息。当点击作者信息时会跳转到作者信息的页面。

能看到具体的作者信息和作者发布过的帖子。
将帖子页面拉到最后
可以进行评论的发布和点赞,当点击发表评论时会刷新页面。显示最新的评论。
对于添加评论,首先创建评论的ORM模型和FORM表单,然后再进行验证和数据库的读写。使用的是一个添加评论的接口。同样也需要要求登录才能发表帖子。

@bp.route('/acomments/',methods=['GET','POST'])
@login_required
def add_comments():form =Addcommentform(request.form)if form.validate():content =form.content.datapost_id =form.post_id.datapost =Postmodle.query.get(post_id)if post:count_pl =post.count_pl +1post.count_pl =count_plcomment =Commentmodle(content=content)comment.post =postcomment.author =g.front_userdb.session.add(comment)db.session.commit()return restful.sucess()else:return  restful.params_error('没有这篇帖子!')else:return restful.params_error(form.get_error())

以上就是论坛首页功能的介绍。后台用户管理系统的介绍以后再写。

基于python-flask制作的论坛相关推荐

  1. 【基于Python+Flask项目部署系列--03】开发测试环境配置-基于Ubuntu16.04

    一.开发测试环境介绍 前提已经部署完[基于Python+Flask项目部署系列--02]Ubuntu16.04服务器安装.建议部署2套环境:开发测试环境+生产环境. 这篇文章主要讲解测试环境如何配置p ...

  2. 【人工智能毕设之基于Python+flask+bilstm的评论情感分析系统-哔哩哔哩】 https://b23.tv/QU56eTl

    [人工智能毕设之基于Python+flask+bilstm的评论情感分析系统-哔哩哔哩] https://b23.tv/QU56eTl https://b23.tv/QU56eTl

  3. 基于Python Flask框架+jquery Ajax技术实现的增删改查(CRUD)+Ajax的异步文件上传

    运行界面(话不多说先上图) 运行之后的index界面,有登陆.注册功能 登陆界面,输入数据库中用户名.密码不为空且密码是加密的数据,进入main界面 注册界面,用的bootstrop的弹窗,用户名和密 ...

  4. 基于 Python django 的小型论坛系统

    django_forum This is a small and simple forum which uses the Django Framework (written in Python lan ...

  5. 【Python程序设计】基于Python Flask的网易云音乐歌单采集与可视化分析平台-源码经过调试,100%可运行

    基于Python Flask的网易云音乐歌单采集与可视化分析平台 项目获取 一.项目简介 二.开发环境 三.项目技术 四.功能介绍 五.功能结构 六.运行截图 项目获取 获取方式(点击下载):是云猿实 ...

  6. 基于Python Flask框架的共享自习室预约系统的设计与实现-计算机毕业设计源码+LW文档

    1.1选题背景 信息技术的发展改变了我们的生活方式,许多行业的管理模式发生了根本性改变,特别是零售业受到电子商务强烈的冲击,越来越多的人参与到网购中.许多传统行业逐渐凋零,蓬勃发展的信息技术带来了大量 ...

  7. 基于 Python+flask 构建态势感知系统(附完整源码)

    一.开发 一个基于linux的态势感知系统,基于python和flask框架开发,项目文件目录如下: admin -核心算法 charts -图表生成 model -类 app.py -主文件 con ...

  8. 一款基于 Python+flask 的态势感知系统(附完整源码)

    一.开发 一个基于linux的态势感知系统,基于python和flask框架开发,项目文件目录如下: admin -核心算法 charts -图表生成 model -类 app.py -主文件 con ...

  9. E3【数据可视化】【组件】基于Python+Flask+Echarts+HTML5拖放(DragDrop)实现的可拖放布局并自动保存布局的动态饼图

    目录 一. 效果展示 二. 实现思路 所需知识点 三. 系统架构 四. 关键代码 1. 页面div布局 2. 布局拖放 drag drop 处理 3. 布局保存 4. Python Flask web ...

  10. 基于Java+SpringBoot制作一个论坛小程序

    制作一个论坛互动平台,让兴趣志同道合者用户聚集在这里交流话题.展示自我.结交朋友. 一.小程序 1.1 项目创建 1.2 首页 1.3 论坛板块页 1.4 个人中心页 1.5 帖子详情页 二.API ...

最新文章

  1. 动态T-SQL语句常見問題與解決方案
  2. 暗影精灵4适合计算机专业,暗影精灵4pro怎么样_RTX系显卡带来的不仅是光追-太平洋电脑网...
  3. 新版本微信导致的ios表单bug
  4. 回溯算法解决八皇后_4皇后问题和使用回溯算法的解决方案
  5. android磁场传感器页面布局在哪,基于磁场检测的寻线小车传感器布局研究
  6. Basic Edit in vim
  7. 可视化软件有哪些?各自的优缺点?
  8. smb协议讲解_SMB协议(使用说明+过程详解+抓包分析)
  9. pr如何处理音效_pr怎么把视频声音去掉 去掉视频中的所有声音,视频消音操作...
  10. Web:仿苹果官网首页HTML和CSS
  11. MySQL(密码恢复及设置)
  12. 应急响应-记一次“完(sang)美(xin)无(bing)缺(kuang)”的SSH口令爆破
  13. 0016_光源和打光(1)
  14. Redis 异地双活实战
  15. SpringBoot中重试框架——Spring-retry与Guava-Retry
  16. 中国芯片的突破带来压力,美国芯片龙头将再度裁员,或已后悔不迭
  17. DeepFunc:一种深度学习框架,可根据蛋白质序列和相互作用准确预测蛋白质功能
  18. uni-app自定义组件
  19. python 与Mysql ,Mongodb以及Redis的交互
  20. xwiki开发者指南-XWiki API 参考文档

热门文章

  1. vs没有添加引用_足球赛事比分:尤文图斯VS里昂欧冠
  2. 如何选择正确的图片格式? 图片格式详细科普
  3. 数字平原搭建赛博朋克风城市夜景
  4. 无法更新到Win8.1的原因与解决办法
  5. vim的安装以及基础使用
  6. @prometheus监控详解
  7. 服务器指令显示字幕,gdc服务器字幕设置
  8. actran安装教程linux,Linux平台Actran软件安装
  9. 深度学习 VS 传统的机器学习
  10. python练习:简单火柴人游戏