文章目录
- 小知识点
- 问题
- 1. 文章标签显示错误
- 2. 文章状态无法回显(open)
- 3. 用户管理页面,图标无法显示
- 4. BuildError
- 5. 用户管理添加用户,使用重复的用户名会报错(open)
- 6. 添加用户,不上传头像会报错(open)
- 7. 部分标签删除时报错:OperationalError (open)
- 8. 使用命令运行时报错:ModuleNotFoundError (open)
- 9. 在管理后台删除自己时报错:AttributeError
- 10. 在set设置环境变量时没有效果
学习教程:Flask从零博客开发实战-b站
小知识点
- host=0.0.0.0表示可以在所有端口上
- 工厂函数:不直接实例化Flask类,而是在一个函数内创建它,应用程序的配置在函数内部进行。
问题
1. 文章标签显示错误
在“文章管理”界面,标签显示出来是: <Tag tag1> <Tag tag2>
,但我其实只想要显示它的名称。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_appFile "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来获取用户# 注册用户即非管理员用户允许登录后查看的urlurls = ['/auth/']user_id = session.get('user_id')if user_id is None:g.user = Noneelse: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 = 1elif 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 = 1else: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,就可以了。
感谢bug的一路陪伴,期待下次不要再见。