如何通过 Django Rest Framework 公开 Django-Constance 设置?

AGr*_*o12 5 python django rest django-rest-framework

我正在构建一个项目,其中需要一些自定义设置,这些设置可由某些无法访问 django 管理面板的用户编辑,这些用户通过 Angular 前端访问应用程序。

我安装了 django-constance 是为了让这些自定义设置可编辑,因为它是我在Django 包网站上找到的最推荐的包。我现在的问题是我不知道如何在我的 API 休息上提供设置。

我从一些自定义视图开始:

class ConstanceSettingSerializer(serializers.Serializer):

name = serializers.CharField()
value = serializers.Field()
defult_value = serializers.Field()
modified = serializers.BooleanField(read_only=True)


from constance import settings as constance_settings

class ConstanceView(APIView):

def get(self, request):

    settings = constance_settings.CONFIG.items()

    return Response(settings, status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)

但现在我不知道如何将这些设置正确传递给我的序列化器。我尝试了这个但没有成功:

 settings_serializer = ConstanceSettingSerializer(settings)
 return Response(settings_serializer.data, status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)

我只收到错误。

知道如何正确执行此操作吗?

谢谢!

Ykh*_*Ykh 6

给你一个演示

\n\n
from .utils import get_settings\nfrom constance import config\nfrom rest_framework.viewsets import ViewSet\n\nclass SettingViewSet(ViewSet):\n    permission_classes = (IsAuthenticated,)\n\n    def setting(self, request, allow_settings):\n        if request.method == \'GET\':\n            # list all setting items\n            return Response(data=get_settings(allow_settings))\n        else:\n            # change all allow setting items in allow_settings\n            for key in request.data:\n                if key in allow_settings and key in getattr(settings, \'CONSTANCE_CONFIG\', {}):\n                    value = request.data[key]\n                    setattr(config, key, \'\' if value is None else value)\n            return Response(data=get_settings(allow_settings))\n\n    def create(self, request):\n        """\n        <p>update with POST:<code>{\'Key\': new_value}</code>\n        """\n        allow_settings = [key for key, options in getattr(settings, \'CONSTANCE_CONFIG\', {}).items()]\n        return self.setting(request, allow_settings)\n\n    def list(self, request):\n        """\n        get all setting item\n        """\n        allow_settings = [key for key, options in getattr(settings, \'CONSTANCE_CONFIG\', {}).items()]\n        return self.setting(request, allow_settings)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 utils.py 中:

\n\n
def get_settings(allow_settings):\n    setting_list = []\n    for key, options in getattr(settings, \'CONSTANCE_CONFIG\', {}).items():\n        if key in allow_settings:\n            default, help_text = options[0], options[1]\n            data = {\'key\': key,\n                    \'default\': default,\n                    \'help_text\': help_text,\n                    \'value\': getattr(config, key)}\n            setting_list.append(data)\n    return setting_list\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 urls.py 中:

\n\n
router.register(r\'setting\', SettingViewSet, base_name=\'setting\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

询问得到http://x.x.x.x/setting/你可以获得:

\n\n
[\n    {\n        "key": "staff_prefix",\n        "default": "",\n        "help_text": "\xe5\xb7\xa5\xe5\x8f\xb7\xe5\x9b\xba\xe5\xae\x9a\xe4\xbb\xa3\xe7\xa0\x81",\n        "value": ""\n    },\n    {\n        "key": "staff_suffix",\n        "default": 3,\n        "help_text": "\xe5\xb7\xa5\xe5\x8f\xb7\xe5\xb0\xbe\xe7\xbc\x80",\n        "value": "3"\n    }\n]\n
Run Code Online (Sandbox Code Playgroud)\n\n

发布http://x.x.x.x/setting/数据,{\'staff_prefix\': \'demo\'}您可以更新其中的值staff_prefix

\n