写点什么

Flask 项目实战优化之【包头市活动网站开发】

作者:上进小菜猪
  • 2022 年 5 月 13 日
  • 本文字数:3042 字

    阅读完需:约 10 分钟

Flask项目实战优化之【包头市活动网站开发】

一,前言

之前的文章提到过现在需求。


1、活动需要手动定为历史活动,不要按照年份自动变为历史活动 2、同时多个活动开展上传


对于需求一,经过这几天的测试与改进已经是非常稳定了哈。对于需求二,也已经基本解决了。下面来记录一下我遇到的疑难杂症以及解决良方:

二,问题一的良方

推进项目的过程中,我发现了应该严重的 bug,就是评委比如说在文化比赛和计算机比赛的俩个比赛中。评委到评委入口的后台评选作品板块,的话默认是最新的一个比赛的信息。比如说先创建的文化比赛,再创建计算机比赛,这样的话评委到后台评选板块就会发现:只能评选计算机比赛的作品。这是一个严重的 bug。非常的困难,幸亏昨天 2:00 临睡觉想出了一种解决方案,不能说是好的解决方法,但是基本实现了我们的需求。

2.1,解决方法

我的解决方案是:新建一个 dbm 数据库,名为:临时比赛标识,临时比赛名称。


我们访问的时候,用户获取比赛标识。存入 dbm 数据库,之后点击访问网站,传入目标参数。


db_config["lingshi_match"]=matchdb_config["lingshi_match_name"]=match_name1
复制代码


如上代码,我们实现了一种临时的效果。match 和 match_name1 分别是比赛的标识和比赛的名称。

2.2,/admin 思路设计

后端设计:


match=db_config["lingshi_match"].decode()return render_template("admin/dashboard.html",match=match)
复制代码


这部分简单哈,拿出来然后传入前端,都是套路。


前端设计:


<a href="/?match={{match}}"> 返回首页  </a>
复制代码


前端写一个超链接,传入 match 临时存储的 id 值。


这部分实现了一个操作:如果在在文化比赛和计算机比赛的俩个比赛中,某评委是从文化比赛进入后台的,依然可以点击首页返回文化比赛,而不是计算机比赛。


2.3,pingxuan_fenlei 思路设计

这部分也是哈,为了解决这个困难,我写了如下代码(原理相同)。


 match_name=db_config["lingshi_match_name"].decode(), match=db_config["lingshi_match"].decode()
复制代码


这是传入的值,直接写入目标值。



完美的分开了。


前端相同操作套路。


{{leixing.val}}({{Post.query.filter_by(leixing=leixing.key,time=time,match=match).count()}})
复制代码


非常的巧妙。

2.X,前方高能;被大佬打开新思路

就在我写博客的时候,我向我的开发队友——郭大佬,提出了一个问题:


就是有一个需求:a 用户访问网站得到值 A,b 用户访问网站得到值 B,a 进入一个模块传入参数 A,b 进入这个模块传入参数 B,互不影响,保持一段时间即可



经过一系列与大佬的对话,打开了我优化的思路。我完全可以有 sqlite 来写呀,比 dbm 方便和强大多了。【等我有时间再优化吧,哈哈】。非常强的全能型选手哈!

三,问题二【\x00\x00\x00 的大型 bug 解决】

一个非常神奇的现象哈,我在处理 dbm 的数据清洗的时候根本,没有这个 bug。



如上代码块为清洗代码块。


with dbm.open('config', 'r') as db:    print('keys():', db.keys())
for k in db.keys(): # for i in k : # print(i) print(k, str(db[k],'utf-8'))
复制代码


我们遍历输出一下,发现还是非常正常的哈。但是如果放到项目里就不行了,爆出一大堆的\x00\x00\x00,非常的难受哈,我明明已经转化格式了,但是还是如此。【特别说明,不是合适的问题,已经转过了,而且排查过好几次】比如说


2021|包头市第二界文化旅游创意作品大赛|3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
复制代码


这样的,我开始追寻他的原因,但是还是没有发现什么问题,但是,我有冒出了应该想法,既然不知道底层的 bug 原因,那么我可以在用户执行一个固定的操作,把 x00 过滤掉不就好了吗。


于是:


 db_config["match_url"] = db_config["match_url"].decode().strip(b'\x00'.decode())
复制代码


我悄悄的在 def config_set():的开头加上这行代码。


这样我们发现,如果在部署初期,进入网站,封面会莫名其妙的消失,但是如何我们进入后台之后,他就会把 X00 搞掉,重新赋值。这样就永久的搞定了这个 bug。

四,效果展示:


这次搞了一个视频上来哈。

五,重要源码展示:

config_set(): 部分如下:


def config_set():    db_config["match_url"] = db_config["match_url"].decode().strip(b'\x00'.decode()).......
复制代码


index(): 部分如下:


def index():    post_count = Post.query.count()    user_count = User.query.count()    page = request.args.get('page', 1, type=int)    match = request.args.get('match', db_config["match"].decode())    is_search = False    search_text = ""    posts = Post.query    if request.method == "POST":        is_search = True        query = request.form["query"]        search_text = query        search = "%{}%".format(query)        posts = posts.filter(            or_(                Post.title.like(search),                Post.text.like(search)            ))
posts = posts\ .filter(Post.enabled == True).filter_by(match=match)\ .order_by(Post.created.desc())\ .paginate(page, app.config['POSTS_PER_PAGE'], False) paginates = posts.has_next or posts.has_prev next_url = url_for( 'index', page=posts.next_num) if posts.has_next else None prev_url = url_for( 'index', page=posts.prev_num) if posts.has_prev else None
posts = False if posts.total == 0 else posts.items

btn_vars = {} for key in db_config.keys(): if key.decode().startswith('btn'): num = key.decode().split('_')[1] btn_vars[f"btn{num}_name"], btn_vars[f"btn{num}_url"] = db_config[key.decode( )].decode().split("|") try: user_scid = [score.post_id for score in current_user.scores] except: user_scid = 0
past_url = db_config["match_url"].decode().split('|') #print(past_url[0]) past_matchs = db_config["past_matchs"].decode().split(',') flag=1 for match_tuple in past_matchs: if not match_tuple: continue match_mark = match_tuple.split("|")[0] match_name1=match_tuple.split("|")[1] if(match==match_mark): break flag=flag+1 match_url=past_url[flag] data_cout= Post.query.filter_by(match=match).count() db_config["lingshi_match"]=match
db_config["lingshi_match_name"]=match_name1 return render_template( "index.html", sort='recent', user_count=user_count, posts=posts, paginates=paginates, next_url=next_url, prev_url=prev_url, match=match, is_search=is_search, search_text=search_text, **btn_vars, post_count=post_count, score_post_ids=user_scid, match_url=match_url, data_cout=data_cout, match_name1=match_name1 ),match
复制代码


def admin(): 部分如下:


def admin():    match=db_config["lingshi_match"].decode()    return render_template("admin/dashboard.html",match=match)
复制代码

六,最后

传统 Flask 镇文!



发布于: 刚刚阅读数: 6
用户头像

上进小菜猪 2022.03.29 加入

内蒙古科技大学,2020届计科。努力做全栈。爱好开发,开发专业户。华为云专家,阿里云专家,华为内蒙古包头市HCSD负责人。

评论

发布
暂无评论
Flask项目实战优化之【包头市活动网站开发】_falsk_上进小菜猪_InfoQ写作社区