목표 : API를 기능별로 분리하여 라우터라는 단위로 나눠서 모듈화
from fastapi import FastAPI
from routers.dns_measure import router as dns_measure
from routers.dns_apply import router as dns_apply
from routers.dns_reset import router as dns_reset
app = FastAPI()
app.include_router(dns_measure)
app.include_router(dns_apply)
app.include_router(dns_reset)
from A import B as C
A : 함수이름
B : 모듈 안에 있는 함수
C : 코드에서 사용할 이름
app.include_B(C)
from fastapi import APIRouter
router = APIRouter()
from fastapi import APIRouter
라우터를 만들기 위해 사용하는 클래스
router = APIRouter()
라우터 객체를 생성
그 후에 코드 작성
@router.get("/measure")
def measure_dns(domain: str = Query(...), count: int = Query(5, gt=0)):
records = []
for name, ip in dns_servers.items():
resolver = dns.resolver.Resolver()
resolver.nameservers = [ip]
times = []
for i in range(count):
try:
start = time.time()
resolver.resolve(domain, 'A')
end = time.time()
elapsed = round((end - start) * 1000, 2)
times.append(elapsed)
except:
times.append(float('inf'))
avg = round(sum(times) / len(times), 2)
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
records.append({
"측정 시간": now,
"DNS 서버": name,
"도메인": domain,
"평균 응답 시간(ms)": avg
})
df = pd.DataFrame(records)
df.to_csv("dns_응답속도_결과.csv", mode='a', index=False, header=not pd.io.common.file_exists("dns_응답속도_결과.csv"), encoding='utf-8-sig')
return {
"도메인": domain,
"측정 횟수": count,
"결과": records,
}
from fastapi import FastAPI, HTTPException, Query, APIRouter
from auto_dns import set_dns
from dns_servers import dns_servers
router = APIRouter()
@router.get("/apply")
def dns_apply(server : str = Query(...)):
if server not in dns_servers:
raise HTTPException(status_code=400, detail="지원되지 않는 DNS 서버입니다.")
server = server.strip()
try:
set_dns(dns_servers[server])
status = f'{server}로 설정 완료'
except Exception as e:
status = f'{server}로 설정 실패'
return {"message" : status}
from fastapi import FastAPI, APIRouter
from auto_dns import reset_dns
router = APIRouter()
@router.get("/reset")
def reset_dns_api():
try:
reset_dns()
return {
"message" : "DNS 리셋 완료"
}
except Exception as e:
return{
"message" : "DNS 리셋 실패"
}
init 파일은 Python에서 디렉토리를 패키지로 인식시키기 위해 필요한 파일입니다.

from codes.routers.dns_measure import router as dns_measure
from codes.routers.dns_apply import router as dns_apply
from codes.routers.dns_reset import router as dns_reset
codes와 routers가 Python 패키지로 인식되기 위해 필요합니다.