WebHU - Programozási kérdések és válaszok

Django DRF: PUT opciók korlátozása a ViewSetben

Szeretném korlátozni a ViewSet-et, hogy az engedélyek alapján különböző bemeneteket tegyen lehetővé:

Az én modelljeim:

class Link(models.Model):
    name = models.CharField("name", max_length = 128)
    page = models.PositiveIntegerField("page", default = 1, choices = [(1, 1), (2, 2), (3, 3)])
    layouts = models.ManyToManyField(Layout)

class Layout(models.Model):
    name = models.CharField("name", max_length = 32) 

Sorozatosító:

class LinkSerializer(serializers.ModelSerializer):
    test = serializers.SerializerMethodField("get_layouts")

    def get_layouts(self): ## this is not displayed?
        return "test" 

    class Meta:
        model = Link
        fields = ["name", "page", "test"]

Van egy segítő osztályom, ami például all_pages engedélyt ad. a restframework API-ban most van egy legördülő menü az 1-3. oldal között, de ha a felhasználónak nincs joga az összes oldal használatára, akkor csak a page 1-et szeretném megjeleníteni a kijelöléshez (vagy szövegmezővé tenni beviteli mező nélkül). Ugyanez a probléma vonatkozik a ManyToMany mezőre is: Hogyan korlátozhatom az elrendezések legördülő menüjét azokra, amelyeket az adminisztrációs síkon kiválasztottam az adott felhasználó számára?

Jelenleg manuálisan ellenőrzök mindent a ViewSet PUT metódusában, és a felhasználó nem engedélyezett... -› ROSSZ KÉRÉS.

EDIT: BC Megkértek, most valami ilyesmit csinálok:

class TestViewSet(viewsets.ViewSet):
    serializer_class = LinkSerializer
    http_method_names = ['get', 'put', 'head']
    authentication_classes = [SessionAuthentication,]
    permission_classes = [IsAuthenticated,]

    def list(self, request):
    ...

    def put(self, request):
        ## page logic
        if "app.all_pages" in request.user.get_user_permissions():
            try:
                if not 1 < int(request.data["page"]) <= 3:
                    return Response(data = "page not 2 or 3", 
                                    status = status.HTTP_406_NOT_ACCEPTABLE)
            except Exception as E:
                return Response(data = f"""Error in page selection: {E}""", 
                                status = status.HTTP_400_BAD_REQUEST)
            page = int(request.data["page"])
        else:
            page = 2
        
        ## layout logic:
        store = Store.objects.get(user = request.user)
        allowed_layouts = [l.id for l in store.layouts.all()]
        if not int(request.data["layout"]) in allowed_layouts:
            return Response(data = f"""layout not allowed for store {store}""", 
                            status = status.HTTP_406_NOT_ACCEPTABLE)
        layout = Layout.objects.get(pk = request.data["layout"])
        
        ## do something with page 2 and layout ... in DB/another API   

  • Tegye közzé a logikához kapcsolódó nézeteit/nézeteit. tedd közzé a segítő módszereidet is 09.04.2021
  • Frissítettem a kérdésemet a megoldásommal (ez jól működik, de biztos vagyok benne, hogy ez egy nem optimális megoldás). 09.04.2021

Válaszok:


1

A kérdés kissé homályos, ezért elmagyarázom, hogyan működnek az engedélyek, és te magad fogod használni őket.

1. o.

Engedélyek a DRF-ben, mint 2 metódus burkolói, így működik.

class PermissionX:
    def has_permission(self, request, view):
        return True

    def has_object_permission(self, request, view, obj)
        return True

Ez egy engedély, has_permission azt mondja (request.user jogosult a jelenlegi view elérésére) és has_object_permission azt mondja (request.user jogosult a obj műveletre).

A obj az az objektum, amelyen a nézeten belül műveleteket végeznek. Ha a nézet működik a felhasználókkal, az objektum a User példánya lesz.

Ezt az ehhez hasonló permission_classes-hez használják

    permission_classes = [IsAuthenticated, PermissionX]

2. o.

Általában a user.has_perm(perm) értéket használja a 'name' in user.permissions helyett. Ennek az az oka, hogy az engedélyek a user.groups-ben létezhetnek, és nem csak a user.permissions.

3. o.

Minden felvett kivételnek PermissionDenied típusúnak kell lennie, amely a DRF-ben létezik.

4. o.

Csomagolja ki az engedélyt egy permission.py mappából az aktuális alkalmazásban.

5. o.

Az Ön engedélyei nem lesznek integrálva a django adminisztrátori felületébe. Ez azért van, mert nem használ DRF-et, és nem használja a végpontokat. Olyan dolgokat használ, amelyeket a django elérhetővé tett számára. Ez normális, a logikát, amiről beszélünk, maga az API kényszeríti ki, és amikor egyéni irányítópultot hoz létre, azt a frontenden is érvényesítenie kell, mint UX típust.

09.04.2021
  • Először is: Köszönöm a részletes választ. Értékelt, megbecsült! De ez nem tartalmazza a kérdésem lényegét: Ha például egy felhasználó (A) be van jelentkezve és látja a legördülő listát az 1-3. oldal között, hogyan tudok létrehozni egy felhasználót (B) (akinek nem kell engedélye) az összes oldal megtekintéséhez) csak egy (1. oldal) bejegyzést tartalmazó menüt mutasson be, amikor bejelentkezik? Vagy rosszul gondolom az egészet, és az a lényeg, hogy mindent mutass meg, és kivételt emelj, ha megtagadják az engedélyt? 09.04.2021
  • Az oldal maga lehet egy modell, amely rendelkezik engedélyekkel 09.04.2021
  • Így működnek a CMS-ek 09.04.2021
  • Igen, én is így csináltam eddig. Csak arra gondoltam, hogy talán jobb lenne elrejteni azokat a mezőket/opciókat, amelyekhez a felhasználó amúgy sem fér hozzá. 09.04.2021
  • Igen, jobb, ha létrehozunk ehhez egy dinamikus szerializálót (dokumentált) 09.04.2021
  • a kérdésem pontosan erre irányult. Meg tudnád mutatni, hogyan közelítsem meg az eredeti kérdésemben szereplő oldalesetet? 09.04.2021
  • Folytassuk ezt a beszélgetést a csevegésben. 09.04.2021
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..