> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cloudtype.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Python

> Python 관련 문제 해결 가이드

## 준비 및 확인사항

<AccordionGroup>
  <Accordion title="지원 Python 버전" defaultOpen={true}>
    * **3.7, 3.8, 3.9, 3.10, 3.11, 3.12**
  </Accordion>
</AccordionGroup>

<Warning>
  로컬/테스트 환경과 클라우드타입에서 설정한 Python 버전이 상이한 경우 정상적으로 빌드되지 않을 수 있습니다.
</Warning>

<AccordionGroup>
  <Accordion title="No module named, Command not found 에러">
    프로젝트가 저장된 GitHub 저장소에 `requirements.txt` 파일 자체가 누락되거나 파일 내부에 필요한 패키지 정보가 누락된 경우입니다. 프로젝트에서 사용하시는 패키지에 대한 명세가 `requirements.txt` 내에 잘 작성되었는지 확인이 필요합니다.
  </Accordion>

  <Accordion title="pip 패키지가 설치 불가">
    Python 버전이 프로젝트에 맞지 않게 설정되었을 가능성이 있습니다. 특히 3.11, 3.12 버전은 이전의 패키지와 의존성 이슈가 발생할 가능성이 크므로 미리 로컬에서 테스트 한 후 알맞은 버전으로 설정해야합니다.
  </Accordion>

  <Accordion title="서비스 접속 시 50X 페이지만 뜹니다.">
    서비스 배포 후 50X 발생 시, 실행 로그 결과에 따라 다음과 같은 케이스로 나눠 살펴볼 수 있습니다.

    **1️⃣ 어플리케이션이 정상적으로 구동되지 않고 예외가 발생하거나 서버가 종료된 경우**

    어플리케이션 구동에 필요한 패키지가 정상적으로 설치되지 않았거나 데이터베이스 연결이 실패했을 수 있습니다. 실행 로그의 에러 메세지를 기반으로 소스 내용 및 [환경 변수 등을 확인](/ko/developers/env)해주세요.

    **2️⃣ 서버는 정상적으로 구동됐는데 권한과 관련된 에러가 발생하는 경우**

    언어 및 프레임워크 중 특정 도메인 규칙에 대하여 CORS 허용 규칙을 적용해주어야 접속가능한 것이 있습니다. [리버스 프록시 페이지](/ko/developers/reverseproxy)를 참고해주세요.

    **3️⃣ 빌드가 정상적으로 완료 되었는데 상태가 ‘시작중’에서 바뀌지 않고 생성된 URL에 접속해도 503 페이지만 뜨는 경우**

    루트 디렉토리가 아닌 서브디렉토리에 코드가 존재하는 경우 이러한 상황이 발생할 수 있습니다. 사용자의 저장소를 디렉토리를 확인하고, 해당되는 경우 [서브디렉토리 설정](/ko/developers/subdir)을 추가해주세요.

    **4️⃣ 서버는 정상적으로 구동됐는데 접속시 에러창이 뜨고 실행 로그에 아무런 반응이 없는 경우**

    소스 코드에 설정된 포트가 배포시에 작성하신 포트와 불일치할 경우일 확률이 높습니다. [입력한 포트를 확인해주세요](/ko/developers/port).
  </Accordion>
</AccordionGroup>

## Django

### 쉘에 접근하지 않고 Django의 Super User 생성

> 환경변수와 시작 명령어를 다음과 같이 세팅하면 Super User를 생성할 수 있습니다.

```shell theme={null}
[환경변수]
DJANGO_SUPERUSER_USERNAME - Django 슈퍼유저 username
DJANGO_SUPERUSER_PASSWORD - Django 슈퍼유저 password
DJANGO_SUPERUSER_EMAIL    - Django 슈퍼유저 email

[시작 명령 - Pre Start Command]
python3 manage.py makemigrations && python3 manage.py migrate && python3 manage.py createsuperuser --noinput
```

<Figure className="mt-2 mb-10" src="faq/python-01.png" />

<Tip>
  User 모델에 별도의 필수 필드를 설정한 경우 `DJANGO_SUPERUSER_필드명(대문자)` 로 하여 환경변수에 추가해야 합니다.
</Tip>

### Django Admin 페이지에서 로그인 시 500 에러

> 도메인에 대한 origin 설정이 `settings.py` 에서 누락되어 발생하는 에러로, 다음의 코드를 `settings.py` 에 추가하면 해결됩니다.

```python theme={null}
ALLOWED_HOSTS = ["localhost", "127.0.0.1", ".cloudtype.app"]
CSRF_TRUSTED_ORIGINS = ['https://*.cloudtype.app']
```

### Django 프로젝트를 배포했는데 manage.py 파일이 존재하지 않는다고 표시

> Python 명령어 입력시 `python`이 아닌 `python3` 으로 실행해야 하며, GitHub 저장소에서 `manage.py` 가 위치한 곳을 정확히 지정해주어야 합니다.

* GitHub 저장소의 루트 디렉토리에 `manage.py` 가 위치한 경우 별도의 설정 필요 없음
* GitHub 저장소의 서브 디렉토리에 `manage.py` 가 위치한 경우 최초 템플릿 생성시, 경로 지정 필요
  * 예) 서브 디렉토리 - `django-mariadb-samplapp`
    <Figure className="mt-2 mb-10" src="faq/python-04.png" />
  * 최초 생성시 서브 디렉토리 필드에 알맞은 디렉토리명 입력
    <Figure className="mt-2 mb-10" src="faq/python-05.png" />

## Flask

### gunicorn: gunicorn command not found 에러 발생

> Flask의 웹 서버 역할을 하는 gunicorn 패키지가 컨테이너 이미지 빌드 시에 설치되지 않은 경우입니다. 배포 대상 GitHub 저장소 내의 `requirements.txt` 파일 내부에 gunicorn 패키지가 올바르게 명시되어 있는지 확인해주세요.

### Flask 서버가 실행 오류

> Start Command 필드에는 기본적으로 `gunicorn -b 0.0.0.0:5000 app:app` 명령어가 세팅되어 있습니다. GitHub 저장소의 Flask 프로젝트에서 `app.py` 아닌 다른 이름의 파일에서 Flask를 import 하여 어플리케이션을 구성하였다면 다음과 같이 명령어를 변경하여야 합니다.

```shell theme={null}
gunicorn -b 0.0.0.0:5000 [Flask를 import 하여 어플리케이션을 실행하는 파일명]:app

# [예시]
# cloudtype.py 에서 Flask를 import 하여 어플리케이션을 실행
gunicorn -b 0.0.0.0:5000 cloudtype:app
```

## FastAPI

### uvicorn: uvicorn command not found 에러

> Flask의 웹 서버 역할을 하는 uvicorn 패키지가 컨테이너 이미지 빌드 시에 설치되지 않은 경우입니다. 배포 대상 Github 저장소 내의 `requirements.txt` 파일 내부에 uvicorn 패키지가 올바르게 명시되어 있는지 확인해주세요.

### FastAPI 서버가 실행 오류

> Start Command 필드에는 기본적으로 `uvicorn main:app --host=0.0.0.0 --port=8000` 명령어가 세팅되어 있습니다. 혹은 GitHub 저장소의 `main.py` 에서 다른 이름의 변수에 FastAPI 객체를 할당한 경우 다음과 같이 명령어를 변경하여야 합니다.추가로, 클라우드타입에 배포시 개발용으로 사용되는 `--reload` 는 Start Command 에서 제외해주셔야 합니다.

```shell theme={null}
uvicorn main:app --host=0.0.0.0 --port=8000

# [예시]
# main.py에서 myapi=FastAPI()로 객체 할당 
uvicorn main:myapi --host=0.0.0.0 --port=8000
```

## 참고

### 공식문서

* [Django Docs](https://docs.djangoproject.com/en/4.2/)
* [Flask Docs](https://flask.palletsprojects.com/en/2.3.x/)
* [FastAPI Docs](https://fastapi.tiangolo.com/ko/)
