responder로 json에 답장할 때 일본어를 유니코드에서 벗어날 수 없음

3672 단어 responderPython
※ 수정
코드가 깨진 것이 아니라 유니코드 도피는 올바른 표현이다.
주석 표시줄을 확인하십시오.
기사 내용을 수정하려고 하지만 서둘러야 한다.

문장 요약


계속docker를 하려고 하는데 Hello World가 안 돼요. 급하면...,저는responder입니다.
프로야구 선수 이름을 json으로 답장하는 API를 시행하면서 일본어 유니코드가 달아난 포테이토칩을 해제한 것이다.

문서로 구현되었지만 유니코드에서 벗어났습니다.


이루어지다

result[0] = {'name': '淺間 大基'}
resp.media = result[0]

브라우저에 표시



역시 이럴 땐 일본 사람인 것 같아

해소 방법


이루어지다

resp.headers = {"Content-Type": "application/json; charset=utf-8"}
resp.content = json.dumps(result[0], ensure_ascii=False)

브라우저에 표시



나는 상술한 대로 하면 된다고 생각한다. 어때?

학급


요컨대
  • ascii에 한정된 인코딩을 하지 않음
  • json
  • 으로 변환
  • Content-Typeのcharset=utf-8
  • 의 실현은 필요한 것이다.
    response반의 실복을 보고 방금 보여준 실복이면 될 것 같은데 어떠세요?
    class Response:
        __slots__ = [
            "req",
            "status_code",
            "text",
            "content",
            "encoding",
            "media",
            "headers",
            "formats",
            "cookies",
            "session",
        ]
    
        def __init__(self, req, *, formats):
            self.req = req
            self.status_code = None  #: The HTTP Status Code to use for the Response.
            self.text = None  #: A unicode representation of the response body.
            self.content = None  #: A bytes representation of the response body.
            self.encoding = DEFAULT_ENCODING
            self.media = (
                None
            )  #: A Python object that will be content-negotiated and sent back to the client. Typically, in JSON formatting.
            self.headers = (
                {}
            )  #: A Python dictionary of ``{key: value}``, representing the headers of the response.
            self.formats = formats
            self.cookies = {}  #: The cookies set in the Response, as a dictionary
            self.session = (
                req.session.copy()
            )  #: The cookie-based session data, in dict form, to add to the Response.
    
        @property
        async def body(self):
            if self.content is not None:
                return (self.content, {})
    
            if self.text is not None:
                return (self.text.encode(self.encoding), {"Encoding": self.encoding})
    
            for format in self.formats:
                if self.req.accepts(format):
                    return (await self.formats[format](self, encode=True)), {}
    
            # Default to JSON anyway.
            return (
                await self.formats["json"](self, encode=True),
                {"Content-Type": "application/json"},
            )
    
        async def __call__(self, receive, send):
            body, headers = await self.body
            if self.headers:
                headers.update(self.headers)
    
            response = StarletteResponse(
                body, status_code=self.status_code, headers=headers
            )
            await response(receive, send)
    
    이상.문제가 있으면 지적해 주세요!

    좋은 웹페이지 즐겨찾기