【问题记录】flask开发blog

简介: 小知识点host=0.0.0.0表示可以在所有端口上工厂函数:不直接实例化Flask类,而是在一个函数内创建它,应用程序的配置在函数内部进行。

小知识点

  1. host=0.0.0.0表示可以在所有端口上
  2. 工厂函数:不直接实例化Flask类,而是在一个函数内创建它,应用程序的配置在函数内部进行。

问题

1. 文章标签显示错误

在“文章管理”界面,标签显示出来是: ,但我其实只想要显示它的名称。Tag的模型如下:

class Tag(BaseModel):
    '''文章标签'''
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128), nullable=False, unique=True)
    def __repr__(self) -> str:
        return '<Tag %s>' % self.name

再html中的显示方法如下

<td>{{ post.tags | join(',') }}</td>

想要正确显示为tag1 tag2,有两种修改方法:

1、修改Tag模型的__repr__方法

def __repr__(self) -> str:
        return '%s' % self.name

2、修改html中的显示相关代码

<td>
  {% for tag in post.tags %}
    {{ tag.name }}
  {% endfor %)
</td>

通过这次问题,我也加深了对应flask的jinjia2模板引擎的理解。

2. 文章状态无法回显(open)

问题描述:文章状态(has_type)无法正确回显,始终锁定发布(show)状态

3. 用户管理页面,图标无法显示

问题描述:我在Templarian/MaterialDesign-Webfont下载了文件materialdesignicons.min.css,但开发文档中使用那些图标仍然无法显示,例如,我引入文件并使用“打开的锁”图标:

<link rel="stylesheet" href="{{ url_for('blog.static', filename='css/materialdesignicons.min.css') }}">
<i class="mdi mdi-lock-open-variant-outline"></i>

图标只会显示一个空心的矩形框。

于是我改用了直接从Google CDN提供的地址引入,并使用图标:

<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<i class="material-icons">lock_open</i>

然后就可以显示了。我并没有多少前端相关的知识,摸石头过河可真折磨人。

4. BuildError

错误信息

werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'admin.user_add'. Did you mean 'admin.user' instead?

发现蓝图掉了一个@,很低级,但代价很大的错误。错误示例:

# 用户 --> 添加用户
bp.route('/user/add', methods=['GET', 'POST'])
@login_required
def user_add():
    return 'hello'

5. 用户管理添加用户,使用重复的用户名会报错(open)

IntegrityError
sqlalchemy.exc.IntegrityError: (MySQLdb.IntegrityError) (1062, "Duplicate entry 'abcd' for key 'user.username'")
[SQL: INSERT INTO user (username, password, avatar, is_super_user, is_active, is_staff, add_date, pub_date) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: ('abcd', 'pbkdf2:sha256:260000$3mziwoJuQ4bmCI4h$cd753b17e6daaf3719ef49bfe6b4ecfb067e8a769d321d8046979913855f373c', 'avatar/c2377e45fe0847e5af561960b4c360cd.png', 0, 1, 0, datetime.datetime(2023, 3, 6, 13, 21, 27, 696086), datetime.datetime(2023, 3, 6, 13, 2

6. 添加用户,不上传头像会报错(open)

AttributeError
AttributeError: 'NoneType' object has no attribute 'filename'

7. 部分标签删除时报错:OperationalError (open)

OperationalError
sqlalchemy.exc.OperationalError: (MySQLdb.OperationalError) (1048, "Column 'category_id' cannot be null")
[SQL: UPDATE post SET category_id=%s, pub_date=%s WHERE post.id = %s]
[parameters: (None, datetime.datetime(2023, 3, 7, 12, 42, 28, 110165), 5)]
(Background on this error at: https://sqlalche.me/e/20/e3q8)

8. 使用命令运行时报错:ModuleNotFoundError (open)

(flask_blog) PS D:\code_all\code_python\Web开发基础\flask_blog> py manage.py
Traceback (most recent call last):
  File "manage.py", line 1, in <module>
    from RealProject import create_app
  File "D:\code_all\code_python\Web开发基础\flask_blog\RealProject\__init__.py", line 5, in <module>
    from flask_sqlalchemy import SQLAlchemy
ModuleNotFoundError: No module named 'flask_sqlalchemy'

9. 在管理后台删除自己时报错:AttributeError

AttributeError: 'NoneType' object has no attribute 'is_super_user'

而且网页刷新、返回或者重启后台程序也没用,会卡在这个报错这里。

发现问题出在”获取用户信息“这里,user_id还在,使用print在后台可以打印出

user_id: 7

但删除后数据库中已经没有这个用户了,g.user是None,然后再调用g.user的属性时,比如g.user.is_super_user,就报错了。

# 获取用户信息
@bp.before_app_request
def load_logged_in_user():
    # 每个请求之前都回去session中查看user_id来获取用户
    # 注册用户即非管理员用户允许登录后查看的url
    urls = ['/auth/']
    user_id = session.get('user_id')
    if user_id is None:
        g.user = None
    else:
        g.user = User.query.get(int(user_id))
        print("user_id: ", user_id)
        print("g.user: ", g.user)
        # 权限判断 --> 没太看懂这一块的逻辑?
        if g.user.is_super_user and g.user.is_active:
            g.user.has_perm = 1
        elif not g.user.is_super_user and g.user.is_active and not g.user.is_staff and request.path in urls:
            g.user.has_perm = 1
        else:
            g.user.has_perm = 0


解决方案:在代码load_logged_in_user()中插入user_id = None,重启后台,然后删掉这一句再重启即可。

10. 在set设置环境变量时没有效果

set FLASK_APP=RealProject
set FLASK_ENV=development
echo %FLASK_APP%

我起初在vscode的终端进行操作,后来换到了windows自带的cmd,就可以了。

11. flask中使用数据库的流程?

使用SQLAlchemyflask-migrate

1、建立模型,并在工厂函数中引入

2、配置环境变量(见第10点)

3、创建数据库

mysql> create database <数据库名> charset=utf8;

4、迁移数据库

flask db init # 仅在第一次迁移时使用
flask db migrate
flask db upgrade

感谢bug的一路陪伴,期待下次不要再见。


相关文章
|
2月前
|
数据库 Python
如何使用Flask进行开发?
【9月更文挑战第1天】如何使用Flask进行开发?
49 3
|
3月前
|
SQL 缓存 数据库
神秘编程领域惊现宝藏!Flask 扩展生态究竟隐藏着怎样的神奇力量?快来揭开提升开发效率的秘密!
【8月更文挑战第31天】在 Flask 的世界里,其简洁而强大的核心框架搭配丰富多彩的扩展生态,为开发者带来了无尽可能性。从数据库集成到用户认证,从表单验证到缓存管理,Flask 提供了众多高质量插件,如 Flask-SQLAlchemy、Flask-WTF 和 Flask-Login,大幅提升了开发效率和代码质量。这些扩展如同宝库中的珍宝,等待着我们去探索和利用,但需谨慎选择以避免不必要的复杂性和性能问题。总之,Flask 的扩展生态助力我们更高效地开发 Web 应用,创造更多优秀作品。
34 0
|
4月前
|
JSON 数据格式 Python
Flask实现内部接口----pycharm安装及新建,location代表着文件路径,下面是Python的环境,Flask是由Python开发的框架,Python文件接口ython通过GET发送
Flask实现内部接口----pycharm安装及新建,location代表着文件路径,下面是Python的环境,Flask是由Python开发的框架,Python文件接口ython通过GET发送
|
4月前
|
API 数据库 开发者
逆袭之路!Django/Flask助你成为Web开发界的璀璨新星!
【7月更文挑战第13天】在Python Web开发中,Django和Flask各具优势。Django适合快速构建大型项目,如在线书店,其ORM和内置功能让复杂应用轻松上手。Flask则以其轻量和灵活性见长,适用于个人博客等小型应用。选择框架应根据项目需求和个人偏好,两者都能助开发者在Web开发领域大放异彩。
49 2
|
4月前
|
数据库 开发者 Python
从菜鸟到大神,Django/Flask 让你秒变 Web 开发界的‘头号玩家’!
【7月更文挑战第12天】在Python Web开发中,Django和Flask框架各具特色。Flask轻量灵活,适合快速搭建简单应用,如博客,基本代码仅需几行。Django则功能全面,适用于复杂项目,如电商网站,内置ORM和管理后台。两者都助力开发者从新手进阶。选择取决于项目需求和个人偏好。学习和实践这两个框架,能助你成为Web开发专家。
55 2
|
4月前
|
JSON 文字识别 数据格式
文本,文字识别,Flask实现内部接口开发,OCR外部接口的开发,如何开发一个识别接口,通过post调用,参数是图片的路径,内部调用,直接传图片路径就行
文本,文字识别,Flask实现内部接口开发,OCR外部接口的开发,如何开发一个识别接口,通过post调用,参数是图片的路径,内部调用,直接传图片路径就行
|
4月前
|
API Python
python flask 提供web的get/post开发
python flask 提供web的get/post开发
45 0
|
5月前
|
JSON API 数据格式
如何使用Flask开发RESTful API
RESTful API(Representational State Transferful Application Programming Interface)是一种基于 REST 架构风格设计的 Web 服务接口,用于实现资源的增删改查(CRUD)操作。它通过使用 HTTP 协议的不同方法(如 GET、POST、PUT、DELETE)和 URL 路径来对资源进行操作,并使用不同的状态码和数据格式进行响应。
59 1
|
4月前
|
开发者 C++ Python
从零到一,Django/Flask带你走进Web开发的梦幻世界!
【7月更文挑战第14天】在Python Web开发中,Django和Flask各具特色。Django是全能框架,提供ORM、模板、认证等全套解决方案,适合快速建站和新手入门;Flask则轻量灵活,适合原型开发和定制化需求。两者都有活跃社区和丰富扩展,Django学习曲线平缓,Flask更需自定义配置。选择适合自己的框架,开启编程新篇章。
50 0
|
6月前
|
存储 安全 数据库
使用Flask进行小型Web应用开发
【5月更文挑战第31天】本文介绍了使用Python的Flask框架开发小型Web应用的基本步骤和最佳实践。从环境搭建开始,确保安装Python和pip,然后通过`pip install Flask`安装Flask。创建应用涉及初始化Flask实例、定义路由函数处理HTTP请求,如`@app.route(&#39;/&#39;)`。Flask使用Jinja2模板引擎渲染HTML,如`render_template(&#39;about.html&#39;)`。为了集成数据库,可借助Flask扩展如Flask-SQLAlchemy或Flask-MongoEngine。