성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] What has case distinction but is ne...
[정성태] 대소문자 '변환'과 함께 따라오는 문제가 바로 대소문자 구분 없...
[정성태] Reverse-engineering what a "short" ...
[정성태] 윈도우의 경우, 스레드 관련 자원을 완전히 회수하기 위해 Thr...
[지현명] Android쪽에서 activity 접근 할때 아래꺼 적어 놓고...
[지현명] Maui.Android에서 폴더 관련 내용 정리 잘 되어 있네요...
[정성태] @정한솔 언급하신 사항이 맞습니다. (C# 13부터) 중간에 i...
[정한솔] 기존 printAll(params int[] args)를 pri...
[정성태] 제가 거기까지는 테스트를 안 해봤군요. ^^ 재미 삼아 저 당시...
[정재겸] 질문이 하나 더 있습니다. 처음에 키보드 인풋은 먹다가 마...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>파이썬 - ASGI를 만족하는 최소한의 구현 코드</h1> <p> 예전에는 WSGI 예제를 다뤘는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 파이썬 - WSGI를 만족하는 최소한의 구현 코드 및 PyCharm에서의 디버깅 방법 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12794'>https://www.sysnet.pe.kr/2/0/12794</a> </pre> <br /> 이번에는 ASGI 스펙을 만족하는 코드를 보겠습니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ASGI Specifications ; <a target='tab' href='https://asgi.readthedocs.io/en/latest/specs/index.html'>https://asgi.readthedocs.io/en/latest/specs/index.html</a> </pre> <br /> 사실, 기본적인 뼈대는 WSGI와 별반 다르지 않고 단지 내부 응답에 대한 코드만 비동기 await을 사용한다는 특징이 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # test_main.py HELLO_WORLD = b"Hello world!\n" <span style='color: blue; font-weight: bold'> async def simple_app(scope, receive, send): event = await receive() await send({ 'type': 'http.response.start', 'status': 200, 'headers': [ [b'content-type', b'text/plain'], ] }) await send({"type": "http.response.body", "body": b'Hello, world!'}) </span> application = simple_app </pre> <br /> 이후, <a target='tab' href='https://www.sysnet.pe.kr/2/0/13431'>gunicorn</a> 또는 <a target='tab' href='https://www.sysnet.pe.kr/2/0/13087'>uvicorn</a> 등의 웹 서버를 통해 이런 식으로 실행하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > gunicorn --bind 0.0.0.0:18090 test_main -k uvicorn.workers.UvicornWorker 또는, uvicorn test_main:application --port 18090 uvicorn test_main:simple_app --port 18090 </pre> <br /> 테스트를 위해 웹 브라우저로 "http://localhost:18090"을 방문하면 simple_app 코드의 동작에 따라 화면에는 "Hello, world!" 응답이 나옵니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, scope 변수에는 전통적인 Request 개체가 대표하는 요청 데이터를 담고 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > { 'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 18090), 'client': ('127.0.0.1', 43242), 'scheme': 'http', 'root_path': '', 'headers': [(b'host', b'localhost:18090'), (b'connection', b'keep-alive'), (b'sec-ch-ua', b'"Chromium";v="124", "Microsoft Edge";v="124", "Not-A.Brand";v="99"'), (b'sec-ch-ua-mobile', b'?0'), (b'user-agent', b'Mozilla/5.0 ...[생략]... Edg/124.0.0.0'), (b'sec-ch-ua-platform', b'"Windows"'), (b'accept', b'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8'), (b'sec-fetch-site', b'same-origin'), (b'sec-fetch-mode', b'no-cors'), (b'sec-fetch-dest', b'image'), (b'referer', b'http://localhost:18090/'), (b'accept-encoding', b'gzip, deflate, br, zstd'), (b'accept-language', b'ko,en-US;q=0.9,en;q=0.8'), (b'cookie', b'=YO0lT82...[생략]...S4InfWBtk2;') ], 'state': {}, 'method': 'GET', 'path': '/favicon.ico', 'raw_path': b'/favicon.ico', 'query_string': b'' } </pre> <br /> 추가로 "event = await receive()" 코드로 받은 event에는 이런 값이 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > { 'type': 'http.request', 'body': b'', 'more_body': False } </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
4647
(왼쪽의 숫자를 입력해야 합니다.)