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

Flask项目实战优化之【包头市政府活动网站开发】,第1张

文章目录
  • 一,前言
  • 二,问题一的良方
    • 2.1,解决方法
    • 2.2,/admin思路设计
    • 2.3,pingxuan_fenlei思路设计
    • 2.X,前方高能;被大佬打开新思路
  • 三,问题二【\x00\x00\x00的大型bug解决】
  • 四,效果展示:
  • 五,重要源码展示:
  • 六,最后

👨‍💻作者简介: 大家好,我是上进小菜猪。内蒙古科技大学,大二计科。技术很菜但不放弃,努力做全栈。 热爱开发,开发软件,开发网站,开发各种东西。🛳️
🛳️个人主页: 上进小菜猪的博客
📗系列专栏:本文写在网站开发专栏 ✉️如果文章知识点有错误的地方,请指正! 和大家一起学习一起进步🎈
🔥如果觉得博主的文章还不错的话,请👍三连+关注支持👍一下博主哦

一,前言

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

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

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

二,问题一的良方

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

2.1,解决方法

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

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

db_config["lingshi_match"]=match
db_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方便和强大多了。【等我有时间再优化吧,哈哈】。
大佬的CSDN博客链接——世界尽头与你
非常强的全能型选手哈!

三,问题二【\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镇文!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/755941.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-30
下一篇 2022-04-30

发表评论

登录后才能评论

评论列表(0条)

保存