데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      FastAPI에서 자동 생성되는 Swagger 문서의 cdn.jsdelivr.net 의존성 없애기

      jangwooseok2 24.05.16
      3,284 11 0
      DEVOTEE 요약
      cdn.jsdelivr.net 접속 불능 사태로 인해 많은 서비스가 깨지는 문제가 발생했습니다. 이 문제로 인해 fastapi에서 자동으로 생성해주는 swagger 문서 접근에도 영향을 미쳤으나, 문제는 swagger-ui.css와 swagger-ui-bundle.js를 직접 구하여 fastapi를 조정함으로써 해결할 수 있었습니다. 이를 통해 cdn.jsdelivr.net과의 의존성 없이 문서를 제공할 수 있게 되었습니다.

      안녕하세요~ SKHYNIX DRAM EUV 노광PHOTO기술팀 장우석 TL입니다.


      다들 알고 계시겠지만, 얼마 전에 큰 일이 있었어요.

      image.png

      인증서 문제로 인한 cdn.jsdelivr.net 접속 불능 사태 | GeekNews (hada.io)


      지난 목요일(5/3)에 cdn.jsdelivr.net이 접속불능에 빠졌습니다.

      저게 어떤 사이트냐면,

      image.png

      image.png


      bootstrap, jquery 등등을 저희가 link tag로 편하게 이용하고자 할 때, 무심코 접속하게 되는 사이트입니다.

      제가 js, css 번들을 다운 받을 필요 없이, 단지 저 link tag를 html에 삽입하는 것만으로 위 라이브러리들을 사용할 수 있어서 편하게 사용들을 했었는데요.


      저거 넣어서 만들었던 서비스들이 여럿 깨져있어서, cdn.jsdelivr.net이 복구 될 때까지 매우 혼란스러운 하루를 보냈었습니다.

      (이래서 귀찮다고 링크 태그 같은 거 쓰고 그러면 안 되나 보네요.)


      image.png

      대부분의 서비스는, js, css 번들 다운 받아 붙이는 걸로 금새 복구할 수 있었는데,

      문제는 fastapi 였습니다.


      fastapi에는 자동으로 swagger 문서를 생성해주는 매우 편리한 기능이 있는데요.

      이걸 사내 api 만들어서 공유할 때 engr들이 엄청 많이 쓰고 있었는데, (사실상 fastapi를 사용하는 이유의 8할...)


      문제는 fastapi에서 자동으로 만드는 swagger 문서가

      https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.9.0/swagger-ui.css

      https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.9.0/swagger-ui-bundle.js

      이 두 녀석으로부터 css, js를 받아온다는 것이었습니다.


      fastapi에서 자동으로 생성해주는 docs endpoint에 대한 configuration 때문에 고민을 좀 했었어요. 결론적으로는 이렇게 해결하시면 됩니다.

      image.png

      https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.9.0/swagger-ui.css

      https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.9.0/swagger-ui-bundle.js


      image.png

      일단 swagger-ui.css 하고 swagger-ui-bundle.js 를 구합니다.

      저는 그냥 브라우저로 저 url에 접속해서 구해둔 게 있어서 썼는데요. 구글 검색하시면 css, js 구하실 수 있으실 거예요.

      (+ 제가 쓴 파일 압축해서 첨부 파일에도 올려뒀습니다.)

      image.png

      얼추 project가 이렇게 구성되어 있다고 치면,

      from fastapi import FastAPI, Response
      from fastapi.responses import RedirectResponse
      from fastapi.openapi.docs import get_swagger_ui_html
      import uvicorn
      from pathlib import Path
      
      PATH_APP_PY = Path(__file__)
      PATH_PROJECT = PATH_APP_PY.parent
      
      app = FastAPI(docs_url=None)  #remove default /docs endpoint
      
      @app.get('/')
      def index():    
          return RedirectResponse('/docs')
      
      @app.get('/docs')
      def swagger_docs():    
          rsp = get_swagger_ui_html(                                          
                                      openapi_url = "/openapi.json",                                   
                                      title = "SWAGGER EXAMPLE",                                    
                                      swagger_css_url="/swagger_css",                                    
                                      swagger_js_url = "/swagger_js"                               
                                  )    
          return rsp
      
      @app.get('/swagger_css')
      def swagger_css():    
          with open(Path(PATH_PROJECT,"swagger-ui.css"),'rt',encoding='utf-8') as f:        
              swagger_css = f.read()    
          return Response(swagger_css,headers={"Content-type":"text/css"})
      
      @app.get('/swagger_js')
      def swagger_js():   
          with open(Path(PATH_PROJECT,"swagger-ui.js"),'rt',encoding='utf-8') as f:        
              swagger_js = f.read()    
          return Response(swagger_js,headers={"Content-type":"text/javascript"})
      
      if __name__ == "__main__":    
          uvicorn.run(app,host="0.0.0.0",port=5000)

      app.py를 이렇게 구성하시면 됩니다. 간단한 샘플 코드니 보면 바로 이해되실 거예요.


      image.png

      https://github.com/tiangolo/fastapi/blob/master/fastapi/openapi/docs.py


      기본적으로 fastapi의 /docs endpoint는

      fastapi.openapi.docs 에 있는 get_swagger_ui_html 을 실행해서 출력하도록 되어 있습니다.

      이 부분을 원하는 대로 커스터마이징해서 실행하도록 구성하면 설정을 바꿔줄 수 있어요.

      image.png

      저 코드를 실행하고 docs 엔드포인트에 들어가보면

      저렇게 swagger 문서에서 cdn.jsdelivr.net과의 의존성이 없어진 것을 확인하실 수 있습니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      jangwooseok2 님의 최신 블로그

      더보기
      동영상 기고하기