小知识点
- host=0.0.0.0表示可以在所有端口上
- 工厂函数:不直接实例化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中使用数据库的流程?
使用SQLAlchemy
和flask-migrate
1、建立模型,并在工厂函数中引入
2、配置环境变量(见第10点)
3、创建数据库
mysql> create database <数据库名> charset=utf8;
4、迁移数据库
flask db init # 仅在第一次迁移时使用 flask db migrate flask db upgrade
感谢bug的一路陪伴,期待下次不要再见。