现有一个前端Antd Pro+后端Django的内容管理系统,现在是:
点击第2页或其他页,结果会报错,且一直loading:
需要搞清楚问题原因并解决。
错误:
发出的请求针对的是不存在的记录,服务器没有进行操作。 请求 http://x.x.x.:112233/api/v1/scripts/group_owner_script_list/?page=2&page_size=20 出错 404
突然想起来:
或许和之前
删除和重建NaturlingCmsServer文件夹有关系?
不管了,去看看代码
看代码是:
@list_route( methods=['get'], url_path='group_owner_script_list', url_name='group_owner_script_list', pagination_class=StandardResultsSetPagination, permission_classes=[ IsAuthenticated, IsUserScriptFunctionGroup, ]) def group_owner_script_list(self, request): filter_condition = self.generateQueryFilterCondiction(request)
和:
apps/script/permissions.py
class IsUserScriptFunctionGroup(permissions.BasePermission): def has_permission(self, request, view): """ topic/dialog的权限,组成员都能查看 """ user = request.user if 'script_function_group.script_function_group' in user.get_group_permissions(): return True else: return False
再去搜:
django get_group_permissions
django.contrib.auth | Django documentation | Django
“get_group_permissions(obj=None)¶
Returns a set of permission strings that the user has, through their groups.
If obj is passed in, only returns the group permissions for this specific object.”
django.contrib.auth.backends | Django documentation | Django
Customizing authentication in Django | Django documentation | Django
“user.get_all_permissions()方法列出用户的所有权限,返回值是permission name的list
user.get_group_permissions()方法列出用户所属group的权限,返回值是permission name的list”
基本上确定是:
此处返回的get_group_permissions的是有问题的。
所以要去找为何有问题。为何之前是正常的。
所以去备份在线mysql到本地,去调试看看什么情况。
另外看到初始化:
添加上面异步创建的超级用户至默认功能组 `python3 ./manage.py add_initial_function_group`
结果找不到:
add_initial_function_group
然后发现是command的文件名:
然后本地恢复:
mysql -uroot -pcrifan_mysql naturling < aliyun_rds_mysql_naturling_180725.sql
然后再去调试代码找原因
结果本地localhost竟然是翻页没问题:
那就奇怪了。
本地重新启动mysql
➜ ~ /usr/local/mysql/support-files/mysql.server stop Shutting down MySQL .... SUCCESS! ➜ ~ /usr/local/mysql/support-files/mysql.server start Starting MySQL . SUCCESS!
重新启动cms的server:
➜ NaturlingCmsServer git:(master) ✗ python3 ./manage.py runserver_plus 65000 * Running on http://127.0.0.1:65000/ (Press CTRL+C to quit) * Restarting with stat Performing system checks... System check identified no issues (0 silenced).
重启web端:
➜ NaturlingCmsWeb git:(master) ✗ npm start
然后再去看看效果
试了半天,终于模拟线上的问题了:
然后就可以去调试问题了。
然后发现:
代码:
class IsUserScriptFunctionGroup(permissions.BasePermission): def has_permission(self, request, view): """ topic/dialog的权限,组成员都能查看 """ logger.info("IsUserScriptFunctionGroup: request=%s,view=%s", request, view) user = request.user logger.info("user=%s", user) userGroupPermissions = user.get_group_permissions() logger.info("userGroupPermissions=%s", userGroupPermissions) if 'script_function_group.script_function_group' in user.get_group_permissions(): return True else: return False
log:
INFO|20180725 10:32:01|permissions:has_permission:16|userGroupPermissions={'script.change_history', 'user.change_functiongroup', 'admin.add_logentry', 'admin.delete_logentry', 'script.change_keywordrel', 'contenttypes.add_contenttype', 'user.change_user', 'script.change_script', 'sites.delete_site', 'contenttypes.change_contenttype', 'admin.admin', 'sites.add_site', 'user.delete_user', 'admin.change_logentry', 'admin_function_group.admin_function_group', 'auth.change_group', 'auth.add_group', 'sessions.add_session', 'script.add_history', 'script.delete_script', 'user.add_user', 'script.delete_topic', 'user.add_functiongroup', 'auth.change_permission', 'contenttypes.delete_contenttype', 'script.add_script', 'script.delete_dialog', 'script.add_review', 'auth.delete_group', 'auth.add_permission', 'script.add_dialog', 'script.change_dialog', 'script.delete_keywordrel', 'sessions.delete_session', 'sessions.change_session', 'auth.delete_permission', 'script.change_topic', 'script.add_keywordrel', 'script.delete_review', 'script_function_group.script_function_group', 'script.change_review', 'user.delete_functiongroup', 'script.add_topic', 'sites.change_site', 'script.delete_history'}
是有script_function_group.script_function_group的
不是权限问题。
那么就是:
127.0.0.1 - - [25/Jul/2018 10:32:01] "GET /api/v1/scripts/group_owner_script_list/?page=2&page_size=20 HTTP/1.1" 404 -
的page方面的问题了。
然后通过调试基本上明白错误的逻辑了:
此处出问题的步骤是:
中,点击某个用户,进去组员列表页面,且url中是带过滤参数:某个用户的id的:
http://localhost:8000/#/script/group-owner-script-list?user_id=44c3de7f-a0e4-4a62-8f64-720044ad6d03
然后点击其他页时:
调用的接口中,并没有把之前的user的id传过去,而是传递了当前的用户所在的组:
此处用户是另外的当前的账号,所以去获取时,本身就2个,连一页20个都不到,所以page=2或更多页,则无法获取到,所以报错。
所以先去给
组成员剧本列表
中,加上根据作者去筛选
然后从统计页面跳转过来时,自动选中该作者
然后翻页时,把当前选中的用户加上,应该就可以了。
【总结】
最后是加上对应的用户授权,即可正常翻页。
相关的部分代码改动:
componentDidMount() { console.log(`GroupOwnerScriptList componentDidMount`) const { dispatch, currentUser, currentUserFunctionGroupList } = this.props; console.log(`currentUser=`, currentUser) console.log(`currentUserFunctionGroupList=`, currentUserFunctionGroupList) dispatch({ type: 'user/fetchCurrent', }).then(() => { }); const parsed = queryString.parse(this.props.location.search); console.log(`parsed=`, parsed) let authorId = "" if (parsed) { authorId = parsed.author_id; console.log(`authorId=`, authorId) if (authorId){ const queryParamDict = { author_id: authorId, }; console.log(`queryParamDict=`, queryParamDict) dispatch({ type: 'script/fetchGroupOnwerScripts', payload: queryParamDict, }); } else { dispatch({ type: 'script/fetchGroupOnwerScripts', }); } } const curUserName = currentUser.name let curFunctionGroup = {} console.log(`curUserName=`, curUserName) for (const curGroup of currentUserFunctionGroupList){ console.log(`curGroup=`, curGroup) if (curGroup.owner === curUserName){ curFunctionGroup = curGroup console.log(`found curFunctionGroup=`, curFunctionGroup) this.setState({currentOwnerFunctionGroup: curFunctionGroup}) break } } if (curFunctionGroup) { const functionGroupID = curFunctionGroup.id; console.log(`functionGroupID=`, functionGroupID) if (functionGroupID) { dispatch({ type: 'functionGroup/fetchFunctionGroupAndMembers', payload: functionGroupID, }).then((respGroupAndMembers) => { console.log(`fetchFunctionGroupAndMembers response`) console.log(`respGroupAndMembers=`, respGroupAndMembers) console.log(`this.props=`, this.props) const { functionGroup: { functionGroup, members } } = this.props; // const { functionGroup, members } = this.props; console.log(`functionGroup=`, functionGroup) console.log(`members=`, members) if (members) { const membersList = members.results console.log(`membersList=`, membersList) console.log(`before setFieldsValue authorId=`, authorId) const { form } = this.props; form.setFieldsValue({ author_id: authorId || "", }); const { formValues } = this.state; console.log(`formValues=`, formValues) const newFormValues = { author_id: authorId || "", ...formValues, }; console.log(`newFormValues=`, newFormValues) this.setState({ formValues: newFormValues, }); this.setState({ currentOwnerFunctionGroupMembers: membersList || [], }); } }); } };
src/common/router.js
'/script/group-owner-script-list': { component: dynamicWrapper(app, ['script', 'user', 'functionGroup'], () => import('../routes/Script/GroupOwnerScriptList')), }, '/script/group-owner-script-count': { component: dynamicWrapper(app, ['script', 'user'], () => import('../routes/Script/GroupOwnerScriptCount')), },
效果: