Apakah ada cara yang lebih baik untuk membuat Layanan Web Django REST?

Saya baru mengenal Python Django - selanjutnya pertanyaan saya.

Saya membuat Layanan Web REST tetapi saya benar-benar tidak puas dengan kode saya, tetapi saya tidak dapat menemukan solusi yang lebih baik. Apakah benar-benar perlu membuat kelas baru untuk setiap bagian URL baru? Jika tidak, bagaimana saya dapat menemukan cara yang lebih baik untuk masalah ini?

urls.py

pola url

 = [
    url(r'^admin/', admin.site.urls),
    url(r'^movement/$', views.MovementDirection.as_view()),
    url(r'^movement/on/$', views.On.as_view()),
    url(r'^movement/off/$', views.Off.as_view()),
    url(r'^movement/stop/$', views.Stop.as_view()),
    url(r'^movement/forward/$', views.Forward.as_view()),
    url(r'^movement/backwards/$', views.Backward.as_view()),
]

urlpatterns = format_suffix_patterns(urlpatterns)

views.py

...
#movement/forward
class Forward(APIView):
    def get(self, request):
        print("FORWARD")
        # engine control
        return Response("Forward")

#movement/backwards
class Backward(APIView):
    def get(self, request):
        print("BACKWARD")
        # engine control
        return Response("Backward")
...

person michael-mammut    schedule 24.05.2017    source sumber


Jawaban (1)


Tidak, Anda tidak perlu membuat kelas baru untuk url baru, yang Anda perlukan adalah tindakan baru di kumpulan tampilan Anda.

url(r'^movements/$', views.MovementDirection.as_view()),

dilihat.py

class MovementDirection(ModelViewSet): # please notice the class
    @list_route
    def register(self, request):
        # you can make it on a whole endpoint
        # or on a single instance by using @detail_route

Periksa pertanyaan ini untuk info lebih lanjut tentang @detail_route vs @daftar_rute

Kemudian Anda dapat meneleponnya dengan permintaan ke movements/register

person Taras Matsyk    schedule 24.05.2017
comment
Terima kasih atas balasan Anda yang sangat cepat, Terjadi kesalahan dan mengarahkan saya ke pertanyaan berikut: Saya mendapatkan kesalahan saat mengubah entri urls.py menjadi ` url(r'^movements/', views.MovementDirection.as_view({'get': 'on'})),` dan hapus anotasi. Kesalahan anotasi adalah NameError: name 'list_route' is not defined. Dan kesalahan lainnya adalah argumen TypeError: The actions` harus diberikan saat memanggil .as_view() pada ViewSet. Misalnya .as_view({'get': 'list'}) - person michael-mammut; 24.05.2017
comment
Kesalahan Anotasi --› dicentang ;) --› impor tidak ada - person michael-mammut; 24.05.2017
comment
Anda harus mengimpor list_route dari rest_framework.decorators. Saya tidak yakin apakah itu berhasil pada ViewSet, mungkin saya menyesatkan Anda dengan jawaban saya. - person Taras Matsyk; 24.05.2017
comment
nah.. untuk menyelesaikan masalah ini ada langkah-langkah saya. url(r'^movements/on/$', views.MovementDirection.as_view({'get':'on'})), url(r'^movements/off/$', views.MovementDirection.as_view({'get':'off'})), Saya menentukan URL untuk setiap subURL, dan saya menambahkan metode ke setiap anotasi @detail_route(methods=['get']) di file views.py - person michael-mammut; 25.05.2017