de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
José  L. Patiño
José L. Patiño
Question

Django REST Framework - Terpisah permissions per metode

Saya menulis sebuah API menggunakan Django REST Framework dan saya bertanya-tanya jika dapat menentukan izin per metode ketika menggunakan kelas berdasarkan pandangan.

Membaca dokumentasi saya melihat bahwa cukup mudah untuk dilakukan jika anda menulis fungsi berdasarkan pandangan, hanya menggunakan @permission_classes dekorator alih fungsi dari pandangan anda ingin melindungi dengan izin. Namun, saya don't melihat cara untuk melakukan hal yang sama ketika menggunakan CBVs dengan APIView kelas, karena itulah aku menentukan hak akses untuk kelas penuh dengan permission_classes atribut, tapi yang akan diterapkan kemudian untuk semua metode kelas (get, post, masukan...).

Jadi, adalah mungkin untuk memiliki pandangan API tertulis dengan CBVs dan juga menentukan hak akses yang berbeda untuk masing-masing metode melihat kelas?

46 2013-11-04T17:48:48+00:00 4
 SonnyStar
SonnyStar
Pertanyaan edit 5 Mei 2019 в 12:06
Pemrograman
rest
django
permissions
python
django-rest-framework
 james
james
29 Januari 2014 в 10:45
2014-01-29T10:45:33+00:00
Lebih
Sumber
Sunting
#22711405

I've menemukan masalah yang sama ketika menggunakan CBV's, seperti yang telah saya cukup kompleks izin logika tergantung pada permintaan metode.

Solusi saya datang dengan adalah untuk menggunakan pihak ketiga 'rest_condition' aplikasi yang tercantum di bagian bawah halaman ini

http://www.django-rest-framework.org/api-guide/permissions

https://github.com/caxap/rest_condition

Aku hanya membagi izin aliran logika sehingga masing-masing cabang akan berjalan, tergantung pada permintaan metode.

from rest_condition import And, Or, Not

class MyClassBasedView(APIView):

    permission_classes = [Or(And(IsReadOnlyRequest, IsAllowedRetrieveThis, IsAllowedRetrieveThat),
                             And(IsPostRequest, IsAllowedToCreateThis, ...),
                             And(IsPutPatchRequest, ...),
                             And(IsDeleteRequest, ...)]

Jadi 'Atau' menentukan cabang izin yang harus dijalankan tergantung pada permintaan metode dan 'Dan' membungkus izin yang berkaitan dengan diterima metode permintaan, jadi semua harus melewati izin yang akan diberikan. Anda juga dapat mencampur 'Atau', 'Dan' dan 'Tidak' dalam masing-masing aliran untuk membuat bahkan lebih kompleks izin.

Izin kelas untuk menjalankan setiap cabang hanya terlihat seperti ini,

class IsReadyOnlyRequest(permissions.BasePermission):

    def has_permission(self, request, view):
        return request.method in permissions.SAFE_METHODS

class IsPostRequest(permissions.BasePermission):

    def has_permission(self, request, view):
        return request.method == "POST"

... #You get the idea
 james
james
Jawaban edit 29 Januari 2014 в 12:01
47
0
Solution / Answer
Kevin Stone
Kevin Stone
5 November 2013 в 8:21
2013-11-05T08:21:57+00:00
Lebih
Sumber
Sunting
#22711404

Izin yang diterapkan untuk seluruh kelas, tapi anda bisa memperhitungkan aspek dari permintaan tersebut (seperti metode GET atau POST) dalam keputusan otorisasi.

Lihat built-in IsAuthenticatedOrReadOnly sebagai contoh:

SAFE_METHODS = ['GET', 'HEAD', 'OPTIONS']

class IsAuthenticatedOrReadOnly(BasePermission):
    """
    The request is authenticated as a user, or is a read-only request.
    """

    def has_permission(self, request, view):
        if (request.method in SAFE_METHODS or
            request.user and
            request.user.is_authenticated()):
            return True
        return False
44
0
 GDorn
GDorn
10 Juli 2019 в 2:55
2019-07-10T14:55:12+00:00
Lebih
Sumber
Sunting
#22711406

Aku berlari ke dalam masalah ini dan benar-benar ingin menggunakan @permission_classes dekorator untuk menandai beberapa tampilan kustom metode dengan izin khusus. Saya akhirnya datang dengan mixin:

class PermissionsPerMethodMixin(object):
    def get_permissions(self):
        """
        Allows overriding default permissions with @permission_classes
        """
        view = getattr(self, self.action)
        if hasattr(view, 'permission_classes'):
            return [permission_class() for permission_class in view.permission_classes]
        return super().get_permissions()

Contoh kasus penggunaan:

from rest_framework.decorators import action, permission_classes  # other imports elided

class MyViewset(PermissionsPerMethodMixin, viewsets.ModelViewSet):
    permission_classes = (IsAuthenticatedOrReadOnly,)  # used for default ViewSet endpoints
    queryset = MyModel.objects.all()
    serializer_class = MySerializer

    @action(detail=False, methods=['get'])
    @permission_classes((IsAuthenticated,))  # overrides IsAuthenticatedOrReadOnly
    def search(self, request):
        return do_search(request)  # ...
3
0
 robin
robin
4 Oktober 2019 в 3:35
2019-10-04T15:35:03+00:00
Lebih
Sumber
Sunting
#22711407

Saya tahu ini adalah pertanyaan lama tapi aku baru saja berlari ke dalam masalah yang sama dan ingin berbagi solusi saya (sejak diterima jawaban itu't cukup apa yang saya butuhkan). @GDorn's jawaban menempatkan saya pada jalur yang benar, tetapi hanya bekerja dengan ViewSet karenadiri.aksi`

I've dipecahkan itu membuat saya sendiri dekorator:

python def method_permission_classes(kelas): def dekorator(func): def decorated_func(mandiri, *args, **kwargs): mandiri.permission_classes = kelas kembali func(mandiri, *args, **kwargs) kembali decorated_func kembali dekorator

Bukan menetapkan permission_classes properti pada fungsi, seperti built-in dekorator tidak, saya dekorator membungkus memanggil dan menetapkan izin kelas pada melihat contoh yang dipanggil. Dengan cara ini, normal get_permissions() doesn't membutuhkan perubahan, karena itu hanya bergantung pada diri.permission_classes.

Contoh kasus penggunaan:

``python dari rest_framework impor pandangan, izin

kelas MyView(pandangan.APIView): permission_classes = (permissions.IsAuthenticatedOrReadOnly,) # digunakan untuk default APIView endpoint queryset = MyModel.benda-benda.semua() serializer_class = MySerializer

@method_permission_classes((permissions.IsAdminUser,)) # menimpa IsAuthenticatedOrReadOnly def menghapus(mandiri, permintaan, id): contoh = self.get_object() # ... ``

Semoga ini bisa membantu seseorang menjalankan ke dalam masalah yang sama!

2
0
Related communities 7
Python Indonesia
Python Indonesia
24 686 pengguna
Programmer Python Indonesia. Group ini dikelola oleh sejumlah admin. Baca pesan tersemat / pinned message: https://t.me/pythonID/217588
Buka telegram
Django Indonesia
Django Indonesia
4 669 pengguna
Web Framework For Perfectionists With Deadlines
Buka telegram
Indonesian Python Warriors
Indonesian Python Warriors
1 462 pengguna
Di grup ini tidak ada kewajiban untuk menggunakan username dan foto. Yang tidak boleh adalah spamming. Gak boleh baper, kalau nanya yang bener, eror jangan difoto pake HP, gunakan screenshot, code copas ke pastebin.com lalu share link ke sini.
Buka telegram
Python-ID Jogja
Python-ID Jogja
962 pengguna
Buka telegram
BASIC PYTHON INDONESIA
BASIC PYTHON INDONESIA
214 pengguna
Buka telegram
Python Newbie Indonesia
Python Newbie Indonesia
180 pengguna
Peraturan grup Python Newbie 🌻Dilarang spam 🌻Dilarang menggunakan bahasa kasar 🌻Dilarang beriklan di grup tanpa seizin admin Beberapa video dasar python dapat diliat melalui channel youtube juan aditya Jangan lupa untuk subscribe ya🙏
Buka telegram
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Asilbek Qadamboyev
Terdaftar 1 hari yang lalu
2
Akshit Mehta
Terdaftar 4 hari yang lalu
3
me you
Terdaftar 1 minggu yang lalu
4
Никита иванов
Terdaftar 1 minggu yang lalu
5
Alex1976G_06
Terdaftar 1 minggu yang lalu
ID
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi