var name = "문자열";
var num = 1;
var fNum = 1.5;
var list = ["apple","banana"];
//map 자료형
var user = {
"id":1,
"username":"ssar"
}
void main(){
print(name);
print(num);
print(fNum);
print(list);
print(list[0]);
//찾을땐 key값으로 찾음
print(user["id"]);
}
void main() 이 실행되기 전에 var 를 먼저 읽음
그렇기에 main안에서 찾을 수 있음
자료형 할당
dynamic == java의 object 즉, 모든 타입
문자열 " " , ' ' 가능
문자열 사이 + 보다는 ${ } 를 권장
String name = "문자열";
int num = 1;
double fNum = 1.5;
// bool 타입
bool isRunning = true; // false
// collection type (어떤 데이터가 순차적으로 저장)
List<String> list = ["apple","banana"];
//map 자료형
Map<String,dynamic> user = {
"id":1,
"username":"ssar"
}
void main(){
print(name);
print(num);
print(fNum);
print(list);
print(list[0]);
//찾을땐 key값으로 찾음
print(user["id"]);
// + 대신에 %{ }를 사용하는 것을 권장
print("유저네임은 " + user["username"]);
print("유저네임은 %{user["username"]}");
}
웹 서버 프로그램의 기능의 주체는 미리 준비된 정보를 이용자(클라이언트)의 요구에 응답해 보내는 것이다. 그 때문에 서버 프로그램 그룹에서는 정보를 그 장소에서 동적으로 생성하고 클라이언트에 송신하려하는 조합을 작성하는 것이 불가능했다. 서버 프로그램에서 다른 프로그램을 불러내고, 그 처리 결과를 클라이언트에 송신하는 방법이 고안되었다. 이를 실현하기 위한 서버 프로그램과 외부 프로그램과의 연계법을 정한 것이 CGI이다
여러 언어들이 사용자들의 다양한 요청을 이해할 수 있게 "이 문(인터페이스)을 지나면 이러한 형태가 됩니다"하고 정해놓은 규약이자 프로그램
WSGI Web Server Gateway Interface
파이썬 스크립트가 웹 서버와 통신하기 위해 만들어진 인터페이스
CGI를 설명한 것과 같이 웹서버에서의 요청을 해석하여 파이썬 응용프로그램에 던지는 역할
Gunicorn이나 uWSGI는 Apache나 nginx로 들어오는 HttpRequest를 Python이 이해할 수 있게 동시통역하여 던져주는 애들
project를 시작할때 만든 settings.py의 위치에서 settings package를 생성
settings.py 이동
settings.py 를 base.py로 이름 변경 후 settings 패키지로 이동
local, deploy 파일 생성
settings 패키지안에 local.py, deploy.py 생성
환경변수 분리
공통 사항은 base.py
apps
static path ...
로컬 환경은 local.py
local에서 사용하는 db
debug, allowed host 등
배포 환경은 deploy.py
docker secrets 에서 가져오는 비밀번호 및 키
배포환경에서 사용하는 db
# local.py
import os, environ
from .base import *
env = environ.Env(
# set casting, default value
DEBUG=(bool, False)
)
# reading .env file
environ.Env.read_env(env_file=os.path.join(BASE_DIR, ".env"))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env("SECRET_KEY")
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env("DEBUG")
ALLOWED_HOSTS = ["*"]
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
# deploy.py
import os, environ
from .base import *
# docker secrets에서 가져오는 비밀키
def read_secret(secret_name):
file = open("/run/secrets/" + secret_name)
secret = file.read()
secret = secret.rstrip().lstrip()
file.close()
return secret
env = environ.Env(
# set casting, default value
DEBUG=(bool, False)
)
# reading .env file
environ.Env.read_env(env_file=os.path.join(BASE_DIR, ".env"))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = read_secret("DJANGO_SECRET_KEY")
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ["*"]
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "django",
"USER": "django",
"PASSWORD": read_secret("MYSQL_PASSWORD"),
"HOST": "mariadb",
"PORT": "3306",
}
}
manage.py 설정
아래의 os.environ.setdefault 부분 수정
두번째 인자에 python manage.py runserver 명령어를 사용할때 실행할 파일 연결
# root 폴더의 manage.py
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == "__main__":
main()