2016-02-27 32 views
5

tôi đang trải qua django rest framework tutorial trên serialization trong đó tôi đã bị mắc kẹt tại JSONRenderersJSONParsers .Below là mã đề cập có:Sự khác nhau giữa JSONParser và JSONRenderer

from snippets.models import Snippet 
from snippets.serializers import SnippetSerializer 
from rest_framework.renderers import JSONRenderer 
from rest_framework.parsers import JSONParser 
from django.utils.six import BytesIO 

snippet = Snippet(code='foo = "bar"\n') 
snippet.save() 

snippet = Snippet(code='print "hello, world"\n') 
snippet.save() 
serializer = SnippetSerializer(snippet) 
serializer.data 
# {'pk': 2, 'title': u'', 'code': u'print "hello, world"\n', 'linenos': False, 'language': u'python', 'style': u'friendly'} 
content = JSONRenderer().render(serializer.data) 
content 
# '{"pk": 2, "title": "", "code": "print \\"hello, world\\"\\n", "linenos": false, "language": "python", "style": "friendly"}' 

stream = BytesIO(content) 
data = JSONParser().parse(stream) 

Tôi biết JSONParser được sử dụng cho deserializing dữ liệu và JSONRenderer được sử dụng để tuần tự hóa nó, nhưng tôi vẫn chưa hiểu rõ sự khác biệt giữa việc tuần tự hóa và deserializing của một dữ liệu. Ai đó có thể cung cấp cho tôi một sự hiểu biết rõ ràng về điều này. (Trả lời bằng một ví dụ được đánh giá cao.)

Và JSONRenderer và JSONParser hoạt động như thế nào?

+2

serializing được chuyển đổi một đối tượng vào một chuỗi (JSON trong trường hợp của bạn) và deserializing là quá trình ngược lại. Chính xác là bạn đang hỏi cái gì? – Selcuk

+0

yeah cùng một điều nhưng trong một cách phức tạp hơn .. Tôi biết định nghĩa bookish nhưng không có một sự hiểu biết tốt cho cùng. –

Trả lời

5

Tôi sẽ bắt đầu với lượt xem. View và viewsets là các lớp trong DRF, nơi mà hầu hết các logic ứng dụng xảy ra.

Ví dụ: ModelViewSet là lớp chịu trách nhiệm cho các hoạt động CRUD để đáp ứng các phương thức POST, PUT, PATCH, GET, DELETE HTTP.

Cho phép xem xét phương thức tạo mặc định từ https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/mixins.py phương pháp này tạo cá thể mô hình của bạn, từ dữ liệu (nếu chúng hợp lệ) gửi qua phương thức HTTP POST và lưu chúng vào cơ sở dữ liệu.

def create(self, request, *args, **kwargs): 
     serializer = self.get_serializer(data=request.data) 
     serializer.is_valid(raise_exception=True) 
     self.perform_create(serializer) 
     headers = self.get_success_headers(serializer.data) 
     return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) 

def perform_create(self, serializer): 
     serializer.save() 

Đây là những gì đang diễn ra ở đây.

self.get_serializer() tạo phiên bản mới của bộ nối tiếp (bạn đặt lớp trình tự tuần tự trước), phải có request.data làm đối số. request.data là (đây là nội dung nhập) từ điển. Từ điển là cấu trúc dữ liệu python chung.

serializer.is_valid() phương pháp kiểm tra nếu request.data hợp lệ. Nếu có, bạn có thể truy cập serializer.data - cũng là từ điển.

serializer.save() phương pháp tạo và duy trì phiên bản thực tế của mô hình của bạn (Đoạn trích) vào cơ sở dữ liệu. Bạn có thể truy cập trực tiếp vào trường hợp như thế này

instance = serializer.save() 

Sau đó, bạn trả về Đối tượng phản hồi được điền với serializer.data về máy khách.

Như bạn có thể thấy, có no Dữ liệu biểu mẫu, JSON, XML, HTML, v.v. trong chế độ xem. Bạn làm việc với các kiểu dữ liệu python và serializer là một từ điển "dịch", ví dụ về mô hình cụ thể của bạn và ngược lại. Nhưng khách hàng gửi dữ liệu (trong trường hợp của bạn) trong yêu cầu HTTP dưới dạng JSON.

JSONParser chịu trách nhiệm chuyển đổi JSON thành từ điển. Phân tích cú pháp được thực hiện bên trong lớp yêu cầu https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/request.py, xin vui lòng nhận thấy rằng không phải là mô hình django HttpRequest tiêu chuẩn.

Bạn có thể đặt nhiều trình phân tích cú pháp, sau đó yêu cầu sẽ chọn một trình phân tích phù hợp theo tiêu đề yêu cầu HTTP: Loại nội dung.

Điều thứ hai là bạn phải trả lại serializer.data cho khách hàng dưới dạng JSON, không phải từ điển. Đó là những gì JSONRenderer. Nó chuyển đổi dict sang JSON và được thực hiện bên trong lớp Response https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/response.py. Ngoài ra, bạn có thể đặt nhiều trình kết xuất và sau đó tùy chọn phù hợp được chọn theo tiêu đề http loại phương tiện được chấp nhận.

Ví dụ về định nghĩa viewset đầy đủ có thể là:

from snippets.models import Snippet 
from snippets.serializers import SnippetSerializer 
from rest_framework.renderers import JSONRenderer 
from rest_framework.parsers import JSONParser 


class SnippetViewSet(viewsets.ModelViewSet): 

    queryset = Snippet.objects.all() 
    serializer_class = SnippetSerializer 
    renderer_classes = (JSONRenderer,) 
    parser_classes = (JSONParser,) 
+0

Tôi đoán đây là những gì tôi cần ... Cảm ơn ... –

Các vấn đề liên quan