文章目录
学习教程:Flask从零博客开发实战-b站
小知识点
- host=0.0.0.0表示可以在所有端口上
- 工厂函数:不直接实例化Flask类,而是在一个函数内创建它,应用程序的配置在函数内部进行。
问题
1. 文章标签显示错误
在“文章管理”界面,标签显示出来是:
<Tag tag1> <Tag tag2>
,但我其实只想要显示它的名称。Tag的模型如下:
classTag(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
,但开发文档中使用那些图标仍然无法显示,例如,我引入文件并使用“打开的锁”图标:
<linkrel="stylesheet"href="{{ url_for('blog.static', filename='css/materialdesignicons.min.css') }}"><iclass="mdi mdi-lock-open-variant-outline"></i>
图标只会显示一个空心的矩形框。
于是我改用了直接从Google CDN提供的地址引入,并使用图标:
<linkhref="https://fonts.googleapis.com/icon?family=Material+Icons"rel="stylesheet"><iclass="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
defuser_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",line1,in<module>
from RealProject import create_app
File "D:\code_all\code_python\Web开发基础\flask_blog\RealProject\__init__.py",line5,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
defload_logged_in_user():# 每个请求之前都回去session中查看user_id来获取用户# 注册用户即非管理员用户允许登录后查看的url
urls =['/auth/']
user_id = session.get('user_id')if user_id isNone:
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 =1elifnot g.user.is_super_user and g.user.is_active andnot 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的一路陪伴,期待下次不要再见。
版权归原作者 清风莫追 所有, 如有侵权,请联系我们删除。