zoukankan      html  css  js  c++  java
  • [Flask] Flask问题集(后端模板渲染项目)

    1.redirect和render_template的区别?

    redirect:重定向,会改变url

    render_template:模板渲染,用模板来渲染当前页,不会改变url

    2.关于 'g' 对象踩的坑

    【描述】

    博客项目,在login请求中设置g对象,在register请求中取得g对象,取得None

    @bp.route('/login',methods=('GET','POST'))
    def login():
        #...
        g.myname = 'john'
    
    @bp.route('/register',methods=('GET','POST'))
    def register():
        #...
        name = g.get('myname')
        print(name) # None

    【分析】

    文档中说道:To share data that is valid for one request only from one function to another ...

    注意是一次请求,一次!

     要实现跨request需要用到session

    3.从DB取出的博客文章显示最多100个字符,其后的省略,如何实现?

    【描述】

    最终需要的效果图:

    我的数据库:

    CREATE TABLE user (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      username TEXT UNIQUE NOT NULL,
      password TEXT NOT NULL
    );
    
    CREATE TABLE post (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      author_id INTEGER NOT NULL,
      created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      title TEXT NOT NULL,
      body TEXT NOT NULL,
      FOREIGN KEY (author_id) REFERENCES user (id)
    );

    【解决方案1】

    1.写sql的时候这样写 :SUBSTR(p.body,1,100) as body

    SELECT p.id , title, SUBSTR(body,1,100) as body,created,author_id,username
    FROM post p JOIN user u ON p.author_id = u.id
    ORDER BY created DESC

    注意一定要定义别名 ... as body,不然会导致在html模板中取不到值

    2.前端css代码

    font-size:0.6em;
    overflow:hidden;
    white-space: nowrap;
    text-overflow:ellipsis;

     【解决方案2】

    在模板中使用过滤器(truncatechars),如下将截断100位之后的字符串,并以...表示

    <p class="list-group-item-text blog-index-textbody">{{ post['body']|truncatechars:100  }}</p>

    4.按照flask官方文档,我在VScode的TERMINAL中运行失败,如何解决?

    【描述】

    【解决方案】

    看了一下VScode的TERMINAL是powershell,CMD 和 powershell 的命令不一样

    powershell

    > $env:FLASK_APP = "myapp"
    > $env:FLASK_ENV="development"
    > flask run

    CMD

    > set FLASK_APP=myapp
    > set FLASK_ENV=development
    > flask run

     【备注】

    1.因为导出的环境变量问题,导致windows下初始化db失败(flask init-db),通过上述方案成功解决

    2.windows下把这启动flask服务的命令写进bat文件,以后每次只需要运行这个bat文件就可以了,当然命令要用CMD的那个

    运行方法: ./start.bat 

    5.从数据库中博客表(TABLE post)取出的时间(created)不对

    【描述】

    博客表:

    CREATE TABLE post (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      author_id INTEGER NOT NULL,
      created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      title TEXT NOT NULL,
      body TEXT NOT NULL,
      FOREIGN KEY (author_id) REFERENCES user (id)
    );

    其中created字段时间比实际时间早了8小时左右

    【解决方案】 

    网上查了一下是因为时区的关系

    记得datetime外层一定要裹上括号

    created TIMESTAMP NOT NULL DEFAULT (datetime('now','localtime')),

     或者

    created TIMESTAMP NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')),

    参考:https://www.cnblogs.com/GDLMO/archive/2010/07/19/1780920.html

    6.今天碰到操作sqlite的时候出现db locked的情况。

    原因是我用了sqlite manager打开了数据库观察,导致删除文章失败。。。呕

    7.从后台取到html的数据(博客内容body),反应到模板上显示出了源码,如何解决

    【描述】

    模板: <p class="list-group-item-text blog-index-textbody">{{ post['body'] }}</p> 

    显示如下:

    【解决方案】

    正则去掉标签

    8.flask怎么实现点击链接后在新标签页打开?

    9.B站发表评论的HTML代码,为什么没有用form?他用的是什么?

    估计是ajax

    10.用form提交表单后刷新页面,会提示“确认重新提交表单”的警告框,如何解决?

     【解决方案】redirect

    11.如何实现评论了之后不刷新页面,只刷新评论列表呢?(局部刷新)

    【解决方案】ajax

    12.一个html里面有多个form表单,如何区别这些表单呢?

     【解决方案】

    用隐藏输入框<input type="hidden" name="form1"/>

    13.删除一篇博客文章后,怎么同时删除留言等信息呢?数据库该如何设计?

     【方法一】

    利用外键完整性约束,在外键加入ON DELETE CASCADE

    DROP TABLE IF EXISTS user;
    DROP TABLE IF EXISTS post;
    DROP TABLE IF EXISTS comment;
    CREATE TABLE user (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      username TEXT UNIQUE NOT NULL,
      password TEXT NOT NULL
    );
    
    CREATE TABLE post (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      author_id INTEGER NOT NULL,
      created TIMESTAMP NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')),
      title TEXT NOT NULL,
      body TEXT NOT NULL,
      FOREIGN KEY (author_id) REFERENCES user (id)
    );
    
    
    CREATE TABLE comment (
      authorid INTEGER NOT NULL,
      postid INTEGER NOT NULL,
      userid INTEGER NOT NULL,
      ctext TEXT NOT NULL,
      ctime TIMESTAMP NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')),
      enable_dis BOOLEAN NOT NULL,
      reply_targetid INTEGER,
      FOREIGN KEY (userid) REFERENCES user (id),
      FOREIGN KEY (reply_targetid) REFERENCES user (id),
      FOREIGN KEY (authorid) REFERENCES post (author_id),
      FOREIGN KEY (postid) REFERENCES post (id) ON DELETE CASCADE
    );
    
    

    注意:sqlite需要手动开启外键完整性约束: sqlite> PRAGMA foreign_keys = ON; 

    参考:https://blog.csdn.net/qq_34082034/article/details/54927680

    14.flask中一个简单的路由系统必须返回一个渲染页面或者重定向页面吗?如果我只是想进行逻辑处理呢?

    【描述】

    一个简单的路由:

    @app.route('/hello')
    def hello():
        pass
        return render_template('index.html')

    前端传来一个form想由后端处理,只需要逻辑处理后update一下数据库就行,不用返回新页面,如何实现呢?

     【解决方案】ajax

    15.【踩坑】模板中注释的语句居然也会被debug检查

    【描述】

    flask会检查{{...}}里面的内容,而不管在模板中是否被注释。因为路由有所改动,导致报错。。

    【解决方案】

    删掉,原理请参考源码

    16.jinja渲染模板html代码会产生大量空行(空格),如何解决?

    在block中加入"-"符号。
    例如:
    ------
    {%- if test -%}
    {%- endif -%}

  • 相关阅读:
    用WebStorm运行Vue项目
    秋招圆满结束
    最新的秋招进度 10月21号
    来更新一下秋招的进度~
    华为三面完进池子啦~9月17日
    C++ 迭代器失效问题
    C++类相关问题(空类、多态、重载、继承)
    C++各种变量、类型的存储位置
    写一个面试中场景题的总结
    明天要面阿里HR面了
  • 原文地址:https://www.cnblogs.com/remly/p/11755489.html
Copyright © 2011-2022 走看看