728x90
반응형
SMALL
728x90
반응형
LIST
728x90
반응형
SMALL
Python 정규식의 표현 및 사용방법을 알아보자.
알아두면 매우 유용하게 사용할 수 있다.

 

■ 정규식 : [] 안에 . ^ $ * + ? { } [ ] \ | ( ) 을 사용하는 식

표현식 동일 표현식 설명
\d [0-9] 숫자와 매치
\D [^0-9] 숫자가 아닌 것과 매치
\s [\t\n\r\f\v] 공백 매치
\S [^\t\n\r\f\v] 공백 아닌 것과 매치
\w [a-zA-z0-9_] 문자, 숫자 매치
\W [^a-zA-z0-9_] 문자, 숫자 아닌 것과 매치
.   a.d 사이에 들어가는 모든 문자와 매치 (Yes : abcd, abd    No : ade, a0e)
ab*c   * 바로 앞에 있는 문자 b가 0부터 매치 (ac, abc, abbc 모두 매치)
ab+c   * 과 동일, 다른점은 문자 b가 1부터 매치 (ac는 매치 안됨)
ab{2}c   b가 2번 반복 되어야 매치 (Yes : abbc    No : abc)
ab{2,5}c   b가 2~5번 반복되면 매치
ab?c ab{0,1}c b가 0~1번 반복되면 매치
^abc   문자열의 처음은 항상 abc로 시작하면 매치 (re.MULTILINE 일 경우 라인별 첫 문자)
\Aabc   문자열의 처음은 항상 abc로 시작하면 매치 (re.MULTILINE 과 상관없음)
abc$   문자열의 마지막은 항상 abc로 끝나면 매치 (re.MULTILINE 일 경우 라인별 첫 문자)
abc\Z   문자열의 마지막은 항상 abc로 끝나면 매치 (re.MULTILINE 과 상관없음)
abc|def   abc 또는 def가 있으면 매치
\babc\b   앞뒤로 스페이스가 있을 경우에만 매치
\Babc\B   앞뒤로 스페이스가 없을 경우에만 매치

 

■ 정규식 응용

import re

p = re.compile('[a-z]+')

 

m = p.match("abc")    # 문자열 처음부터 정규식과 매치되는지 확인

print(m)    # 결과값 : <re.Match object span=(0, 3), match='abc'>

 

m = p.match("00abc")

print(m)    # 결과값 : None

 

m = p.search("abc")    # 문자열 전체를 검색하여 정규식과 매치되는지 확인

print(m)    #과값 : <re.Match object; span=(0, 3), match='abc'>

 

m = p.search("00abc")

print(m)    # 결과값 : <re.Match object; span=(2, 5), match='abc'>

 

m = p.findall("a b c")    # 리스트로 반환

print(m)    # 결과값 : ['a', 'b', 'c']

 

m = p.finditer("abc def ghi")    # 반복 가능한 개체로 돌려줌

print(m)    # 결과값 : <callable_iterator object at 0x000001886C72FFD0>

for i in m:

    print(i)

# 결과값

# <re.Match object; span=(0, 3), match='abc'>

# <re.Match object; span=(4, 7), match='def'>

# <re.Match object; span=(8, 11), match='ghi'>


참고) 위 2줄은 아래 1줄로 사용할 수 있음.

p = re.compile('[a-z]+')

m = p.match("abc")

 

m = re.match('[a-z]+', "abc")


# #1, #2의 차이점

import re

 

p = re.compile("^abc\s\w+")    #1

p = re.compile("^abc\s\w+", re.MULTILINE)    #2

 

data = """abc one

abc two

abc three"""

 

print(p.findall(data))    # 결과값 : ['abc one'] - 첫 번째 줄만 매치    #1

print(p.findall(data))    # 결과값 : ['abc one', 'abc two', 'abc three'] - 라인별로 매치    #2


# '\abc'를 찾을 때는 \를 하나 더 쓴다. '\\abc'를 찾을 때는 '\\\\abc' 이렇게 사용한다.

p = re.compile("\\abc")

 

# 간단하게 사용하는 방법은 앞에 r을 붙이면 된다. 

p = re.compile(r"\abc")


# 전화번호 형태의 정규식

p = re.compile(r"(?P<name>\w+)\s+(?P<phone>\d+[-]\d+[-]\d+)")

m = p.search("mobile 010-1234-5678")

 

print(m.group(0))    # 결과값 : mobile 010-1234-5678 (전체 문자열 반환)

print(m.group(1))    # 결과값 : mobile (괄호로 묶인 1번째 문자열 반환)

print(m.group("name"))    # 결과값 : mobile (괄호로 묶인 1번째 문자열을 name이라는 이름을 통하여 문자열 반환)

print(m.group(2))    # 결과값 : 010-1234-5678 (괄호로 묶인 2번째 문자열 반환)


# 문자열 바꾸기

p = re.compile("(park|kim|lee)")

m = p.sub("first", "park name and kim name")

print(m)    # first name and first name

 

p = re.compile(r"(?P<name>\w+)\s+(?P<phone>\d+[-]\d+[-]\d+)")

m = p.sub("\g<phone> \g<name>", "mobile 010-1234-5678")

print(m)    # 결과값 : 010-1234-5678 mobile

728x90
반응형
LIST
728x90
반응형
SMALL
Python 내장 함수 및 라이브러리를 어떻게 사용하는지, 파일 읽기, 쓰기 등 어떻게 하는지 살펴보자.

 

■ 파일 읽기, 쓰기 등 

# 파일 생성

f = open("d:/new.txt", 'w')    # 'r' : 읽기 모드    'w' : 쓰기 모드    'a' : 추가모드

for i in range(0, 10):    # 0~9까지 

    a = str(i) + "row\n"    # "\n"은 new line

    f.write(a)

f.close()    # close를 하지 않으면 파일이 열려 있는 상태이므로 꼭 close를 해줘야 한다. (파일 삭제가 되지 않음)

 

# 파일 읽기 (case1 ~ case3)

f = open("d:/new.txt" , 'r')

 

# case1 - line별로 담아서 출력

lines = f.readlines()

for line in lines:

    print(line)

 

# case2 - line 1개 출력

line = f.readline()

print(line)

 

# case3 - line 1개를 담아 1 글자씩 출력

lines = f.readline()

for line in lines:

    print(line)

 

f.close()

 

# read를 통하여 한번에 가져오기

f = open("d:/new.txt" , 'r')

a = f.read()

print(a)

f.close()

 

# 파일 내용 추가

f = open("d:/new.txt", 'a')

for i in range(10, 20):    # 10~19까지

    a = str(i) + "row"

    f.wirte(a)

f.close()

 

# f.close()를 사용하지 않고 파일 닫기

with open("d:/new.txt", 'r') as f:

    f.read()

 

■ Python 내장 함수

1. 절대값 : abs(-1.3) → 1

2. 모두 참이면 : all([1,2,3,4,5]) → True,    all([0,1,2,3,4]) → False

3. 하나라도 참이면 : any([0,1,2,3]) → True

4. 몫과 나머지 : divmod(9, 4) → (2, 1)

5. 정수 변환 : int(1.4) → 1

6. 문자열 변환 : str(7) → '7'

7. 리스트 변환 : list("12345") → ['1', '2', '3', '4', '5']

8. 튜플 변환 : tuple("12345") → ('1', '2', '3', '4', '5')

9. 길이 : len("12345") → 5

10. 최대값 : max([1, 2, 3]) → 3

11. 최소값 : min([1, 2, 3]) → 1

12. 아스키 값 : ord("a") → 97

13. 제곱 : pow(2, 3) → 8

14. 범위

   - list(range(5)) → [0, 1, 2, 3, 4]

   - list(range(5, 10)) → [5, 6, 7, 8, 9]

   - list(range(1, 10, 2)) → [1, 3, 5, 7, 9]

15. 반올림

   - round(0.7) → 1

   - round(0.5) → 0    # ※ 0이 되는 것 주의

   - round(0.555, 2) → 0.56

16. 정렬 : sorted([3, 2, 1]) → [1, 2, 3]

17. 합 : sum([2, 3, 5]) → 10

18. 자료형 가져오기 : type("a") → <class 'str'>

19. 자료형 묶음 : list(zip([1, 2], [3, 4])) → [(1, 3), (2, 4)]

 

■ 라이브러리(library) 사용

import os

import shutil

import glob

import tempfile

import time

import calendar

import webbrowser

 

os.environ    # 환경변수 출력

os.chdir("d:/")    # 디렉터리 변경

os.getcwd()    # 디렉터리 위치

 

shutil.copy("d:/new.txt", "d:/new1.txt")    # new.txt을 new1.txt로 복사, 파일이 있으면 덮어씀

 

glob.glob("d:/new*")    # d드라이 안에 new로 시작하는 파일 찾기

 

file = tempfile.mkstemp()    # 중복되지 않은 임시 파일을 만듦, 결과값은 파일 경로

# 임시로 파일을 만들고, close()로 파일을 삭제한다.

f = tempfile.TemporaryFile()

f.close()

 

time.time()    # 1970.01.01 00:00:00 기준으로 지난 시간을 초단위로 반환 (UTC 기준)

time.localtime(time.time())    # 년, 월, 일, 시, 분, 초로 반환

time.asctime(time.localtime(time.time()))    # 날짜 정렬

time.ctime()    # 오늘날짜 반환

time.strftime('%a', time.localtime())    # 요일 반환 (형태 : 'Sun') - 날짜 포맷 코드는 아래 표 참고

 

calendar.calendar(2023)    # 2023년 달력 (한 줄 표시)

calendar.prcal(2023)    # 2023년 달력 (달력처럼 표시)

calendar.prmonth(2023, 5)    # 2023년 5월 달력

calendar.weekday(2023, 5, 21)    # 6 반환 (월요일 : 0 ~ 일요일 : 6)

calendar.monthrange(2023, 5)    # (0, 31) 반환 : 0은 5월 시작일의 요일, 31은 5월의 마지막 날

 

webbrowser.open("http://200-rush.tistory.com")    # 해당 url open

 

■ 날짜 포맷 코드

코드 표현 (설명) 코드 표현 (설명) 코드 표현 (설명)
%a 'Sun' (약자) %I '02' (12시 기준 시간) %w '0' (요일)
%A 'Sunday' %j '141' (1년 중 누적날짜) %W '20' (1년 중 누적 주 - 월요일 시작)
%b 'May' (약자) %m '05' (월) %x '05/21/23/
%B 'May' %M '08' (분) %X '14:13:39'
%c Sun May 21 14:04:38 2023 %p 'AM' or 'PM' %Y '2023'
%d '21' (날짜) %S '23' (초) %Z '대한민국 표준시'
%H '14' (24시 기준 시간) %U '21' (1년 중 누적 주 - 일요일 시작) %y '23' (yy만 표시)

- 날짜 포맷 코드 응용 : time.strftime('%Y%m%d', time.localtime()) → '20230521'

728x90
반응형
LIST
728x90
반응형
SMALL
Python 자료형 정리 list, tuple, dictionary, bool, 집합 사용법

 

■ 리스트(list) 자료형

a = [1, 2, 3, 4, 5]

b = [6, 7, 8, 9]

 

# 사용 및 결과값

a[0] → 1, a[1] → 2 ...

a[0:2] → [1, 2]

a[:2] → [1, 2]

a[2:] → [3, 4, 5]

a[2] = 10 → [1, 2, 10, 4, 5]

 

# 순서대로 리스트 아래 명령어를 실행하면 a값이 변경된다.

del a[2] → [1, 2, 4, 5]    # 10 제거

a.append(9) → [1, 2, 4, 5, 9]    # 맨 뒤 값 추가

a.reverse() → [9, 5, 4, 2, 1]    # 정렬

a.sort() → [1, 2, 4, 5, 9]    # 정렬

a.insert(0, 0) → [0, 1, 2, 4, 5, 9]

a.remove(0) → [1, 2, 4, 5, 9]

a.pop() → 9    # 맨 끝 자리 값 출력 후 삭제

a → [1, 2, 4, 5]    # 삭제 후 값

a.pop(1) → 2

a → [1, 4, 5]

a.count(4) → 1    # 1의 갯수

a.extend([6, 7]) → [1, 4, 5, 6, 7]

 

■ 튜플(tuple) 자료형

1. 리스트와 비슷하나, [] 대신 ()으로 감싸고, 값을 수정할 수 없다.

- 사용법 : a = 1,2,3 또는 a = (1,2,3), 안에 값이 1개일 경우에는 a = (1,)과 같이 ,를 붙여준다.

 

■ 딕셔너리(dictionary) 자료형

dic = {"key": "키", "value": "벨류"}

 

dic["key"] 또는 dic.get("key") → '키'    # 차이점 : 키 값이 없는 "aa"로 찾는 경우 전자는 에러, 후자는 None값을 가져온다.

dic["value"] 또는 dic.get("value") → '벨류'

dic.get("aa", "기본값") → '기본값'    # 키 값이 없는 경우 None값이 아닌 뒤에 지정한 '기본값'으로 가져온다.

dic["add"] = "추가"

dic → {'key': '키', 'value': '벨류', 'add': '추가'}

del dic["add"]

dic → {'key': '키', 'value': '벨류'}

dic.keys() → dict_keys(['key', 'value'])

dic.values() → dict_values(['키', '벨류'])

dic.items() → dict_items([('key', '키'), ('value', '벨류')])

"key" in dic → True    # 딕셔너리에 키 값이 있는지 체크

 

■ 교집합, 차집합, 합집합

aa = [1, 2, 3, 4]

bb = [3, 4, 5, 6]

 

set(aa) & set(bb) → {3, 4} 또는 set(aa).intersection(set(bb))    # 교집합

set(aa)-set(bb) → {1, 2} 또는 set(aa).difference(set(bb))    # 차집합

set(aa).union(set(bb)) → {1, 2, 3, 4, 5, 6}    # 합집합

 

■ 불(bool) 자료형

1. 문자인 경우 빈값이면 False

2. 리스트인 경우 리스트가 없으면 False

3. 숫자인 경우 0이 아니면 True, 그 외 False

 

참고: Python 자료형 정리 (숫자형, 문자형)

728x90
반응형
LIST
728x90
반응형
SMALL
Python 자료형 정리, 숫자형, 문자형 사용법

 

1. 숫자형 더하기 : 1 + 2 → 3

2. 문자형 더하기 : "aa" + "bb" → 'aabb'

3. 숫자형 곱하기 : 1 * 2 → 2

4. 문자형 곱하기 : "aa" * 3 → 'aaaaaa'

5. 제곱근 : 2 ** 4 → 16

6. 나누기 : 1 / 2 → 0.5

7. 나머지 : 3 % 2 → 1

8. 몫 : 8 // 3 → 2

9. 문자열 만들기 : "" 또는 ''로 감싸도 동일, 문자열 안에 ', "표현은 아래와 같이 처리

- "abc'd" → abc'd 또는 'abc"d' → abc"d

- 같은 문자로 감싸는 경우는 " 또는 ' 앞에 \ 를 붙인다. ("abc\"d" → abc"d)

10. 줄 바꿈

- 문자열 안에 \n 삽입 또는 """ """를 이용

"aaaaa\nbbbb"

"""

aaa

bbb

"""

11. 문자열 길이 : len("aa") → 2

12. 문자열 가져오기 : 문자열 첫 번째는 0부터 시작, -1은 뒤에서부터 시작

a = "abcd"

# 문자열 첫 번째는 0부터 시작

a[0] → "a", a[1] → "b", a[2] → "c", a[3] → "d"

 

a[-1] → "d"    # -1은 뒤에서부터 시작

a[0:3] → "abc"    # 0번째부터 3번째까지 (주의 : 마지막 인덱스는 제외)

a[1:3] → "bc"    # 1번째부터 3번째 까지(주의 : 마지막 인덱스는 제외)

a[2:] → "cd"    # 2번째부터 끝까지

a[:2] → "ab"    # 2번째까지(주의 : 마지막 인덱스는 제외)

a[0::2] → "ac"    # 0번째부터 끝까지, 2자리씩

a[-1::-2] → "db"    # 끝에서부터 0번까지, 2자리씩 역순

a[-1:0:-1] → "dcb"    # 끝에서부터 0번까지, 역순(주의 : 마지막 인덱스는 제외)

a[-1::-1] → "dcb"    # 끝에서부터 0번까지, 역순

 

# 주의할 점 : 인덱스 범위 지정 시, 마지막 인덱스를 지정해 주면 마지막 인덱스는 제외하고 출력된다.

13. 대입(치환) : %s는 숫자, 문자 다 됨

- 숫자형 (결과값 : '손가락 5개')

   - "손가락 %d개" % 5

   - "손가락 {0}개".format(5)

   - "손가락 {a}개".format(a=5)

- 문자형 (결과값 : '손가락 다섯개')

   - "손가락 %s개" % "다섯"

   - "손가락 {0}개".format("다섯")

   - "손가락 {a}개".format(a="다섯")

- 조합 (결과값 : '손가락 5개, 다섯개')

   - "손가락 %d개, %s개" % (5, "다섯")

   - "손가락 {0}개, {1}개".format(5, "다섯")

   - "손가락 {a}개, {b}개".format(a=5, b="다섯")

- "%"가 포함되어 있는 경우 : "%d%%" % 100 = '100%'

14. 정렬, 공백

- 우측 정렬 (결과값 : '    p')

   - "%5s" % "p"

   - "{0:>5}".format("p")

   - f"{'p':>5}"

- 좌측 정렬 (결과값 : 'p    ')

   -  : "%-5s" % "p"

   - "{0:<5}".format("p")

   - f"{'p':<5}"

- 가운데 정렬 (결과값 : '  p  ')

   - "{0:^5}".format("p")

   - f"{'p':^5}"

 - 공백 채우기 : (결과값 : '++p++')

   - "{0:+^5}".format("p")

   - f"{'p':+^5}"

- 소숫점 : (결과값 : '    1.1234')

   - "%10.4f" % 1.1234

   - "{0:10.4f}".format(1.1234)

   - f"{1.1234:10.4f}"

15. 문자 개수 세기

결과 : 3

a = abbcccdddd

a.count('c')

16. 문자 찾기

결과 : 3

a = abbcccdddd    # c가 있는 첫 번째 위치

a.find('c')    # c라는 문자열이 없으면 -1

a.index('c')    # c라는 문자열이 없으면 에러

17. 문자 삽입

결과 : 'a,b,c,d'

",".join('abcd')

",".join(['a', 'b', 'c', 'd'])

18. 소문자를 대문자로, 대문자를 소문자로

a = "ab"

b = "CD"

a.upper()    # 결과값 : 'AB'

b.lower()    # 결과값 : 'cd'

19. 공백 지우기

a = "  ab  "

a.lstrip()    # 왼쪽 공백 지우기 결과값 : 'ab  '

a.rstrip()    # 오른쪽 공백 지우기 결과값 : '  ab'

a.strip()    # 양쪽 공백 지우기 결과값 :  'ab'

20. 문자 바꾸기

a = "aabbcc"

a.replace("bb", "kk")    # 결과값 : 'aakkcc'

21. 문자 나누기

a = "aa bb cc dd"

b = "aa,bb,cc,dd"

 

a.split()    # 결과값 : '''aa, ''bb, 'cc', 'dd']

b.split(",")    # 결과값 : ['aa', 'bb', 'cc', 'dd']

 

참고 : Python 자료형 정리 (list, tuple, dictionary, bool, 집합)

728x90
반응형
LIST
728x90
반응형
SMALL

 

앞에서 Django Swagger DRF(django Rest Framework)을 알아봤다면,
이번에는 Ninja에 대해서 알아보자.
DRF(Django Rest Framework) Swagger와 비교해 보고 싶으면 이전 포스팅 참고: Django-Swagger-DRF

 

■ Ninja 설치 및 사용법

1. Ninja 설치 : pip install django-ninja

2. 프로젝트 구조

3. Ninja 사용법

# django app의 views.py

from ninja import NinjaAPI

api = NinjaAPI()    # NinjaAPI() 괄호 안의 속성에 따라 사용자가 원하는 데로 변경 가능

 

@api.get("/get", tags=["get의 이름"], summary="get summary")    # tags, summary 등의 속성으로 api 정보를 줄 수 있음

def get(request, param1: int, param2: int = None):    # None 값을 주면 required(필수값)이 아님, 항상 필수값 뒤로 코딩하여야 함

    return {"result": param1 + param1}    # json 형식으로 return값 세팅

 

@api.get("/format/{a}and{b}")    # {} 안의 값에 따라 return값이 달라짐

def get_format(request, param1: int, param2: int):

    return {"add": param1 + param2, "multiply": param1 * param2}

 

@api.get("/response/", response={200: Item, 403: Error})    # Item, Error는 django app의 schemas.py에 선언

def get_response(request):

    if not request.user.is_authenticated:

        # response 형식에 따라 return값 세팅, message 외 다른 값을 추가해도 Error Class로 세팅이 이미 되어 있기 때문에 나오지 않음

        return 403, {"message": "Please sign in first"}

    return request.user

 

@api.api_operation(["POST", "PATCH"], "/path")    # post, patch 동시 선언

def mixed(request):

    return {"result": True}

 

@api.post("/post")

def post(request, param1: str, item: Item):    # Item은 django app의 schemas.py에 선언

    return {"result": True, "message": "메세지"}


# django app의 schemas.py

from typing import List

from ninja import Schema

 

class Item(Schema):

    name: str

    description: str

    price: float

    quantity: int

 

class Error(Schema):

    message: str


# django project의 urls.py에 선언

from django.contrib

import admin from django.urls import path

from django_app_2.views import api    # app import

 

urlpatterns = [

    path('admin/', admin.site.urls),

    path('api/', api.urls)

]

4. 실행화면

- 기본 url은 로컬 주소에 path에 설정된 값에 /docs를 붙이면 Swagger가 실행된다.

- http://127.0.0.1:8000/api/docs

Ninja Swagger 실행화면

5. views.py에 주석으로 달아놓은 부분을 바꿔가면서 api가 어떻게 바뀌는지 꼭 테스트해 보고, 추가적으로 기능이 필요하다면 Ninja 공식사이트를 참고하자.

    지식도 없고, 영어도 잘 못하는 내가 봐도 그렇게 어렵지 않게 설명이 잘 되어 있다. 

    - Ninja 공식사이트 : https://django-ninja.rest-framework.com/

 

728x90
반응형
LIST
728x90
반응형
SMALL
Django에서 지원하는 DRF(Django Rest Framework) 간단하게 Setting 하기

 

기본적으로 Swagger연동을 위해서는 Django가 설치되어 있어야 한다.
또한 App, Project 생성되어있어야 한다.
준비가 안되어 있으면 이전 포스팅 참고: Python, Django, Anaconda Setting, PyCharm Project

 

Swagger(DRF) 세팅 방법 및 결과 확인

1. DRF(Django Rest Framework) 설치 : pip install djangorestframework

2. Drf-Yasg 설치 : pip install drg-yasg

3. settings.py에 설치된 install 한 app추가

INSTALLED_APPS = [

    ........,

    'drf_yasg',

    'rest_framework'

]

4. 복사, 붙여 넣기 수준으로 urls.py에 아래 소스 추가

from rest_framework.permissions import AllowAny

from drf_yasg.views import get_schema_view

from drf_yasg import openapi

from django.urls import re_path

 

# [5. 실행화면]과 비교하면 쉽게 이해 가능(모두 수정가능)

schema_view = get_schema_view(

    openapi.Info(

        title="Snippets API",

        default_version='v1',

        description="Test description",

        terms_of_service="https://www.google.com/policies/terms/",

        contact=openapi.Contact(email="contact@snippets.local"),

        license=openapi.License(name="BSD License"),

    ),

    public=True,

    permission_classes=[AllowAny]

    # [참고]

    # AllowAny(기본값) : 인증에 관계없이 모두 허용

    # IsAuthenticated : 인증된 요청만 허용

    # IsAdminUser : Staff인증 요청만 허용

    # IsAuthenticatedOrReadOnly : 인증이 안되어 있으면 읽기 권한만 허용

    # DjangoModelPermissons : 인증된 요청만 허용 + 장고 모델단위 권한 체크

    # DjangoModelPermissionsOrAnonReadOnly : DjangoModelPermissons 유사, 인증이 안되어 있으면 읽기 권한만 허용

    # DjangoObjectPermissons : 인증이 안되어 있으면 거부, 인증이 되어있으면 Object에 대한 권한 체크를 수행

)

 

# 기존에 있는 urlpatterns

 

if settings.DEBUG:

    urlpatterns += [

        re_path(r'^swagger(?P\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name="schema-json"),

        re_path(r'^swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),

        re_path(r'^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc')

    ]

5. 실행화면

    - http://127.0.0.1:8000/swagger/

Swagger 실행화면

 

공식문서 : https://drf-yasg.readthedocs.io/en/stable/readme.html

728x90
반응형
LIST
728x90
반응형
SMALL
PyCharm을 통하여 Django App 및 Project를 생성하고,
App에 있는 views.py에 있는 함수를 실행했을 때, Error가 나는 경우 해결책

 

■ App을 만들어 사용하는 간단한 방법을 알아보자.

1. 아래 이미지는 Django Project와 App을 만들어놓은 상태이다.

Django Project, App이 추가된 화면

2. django_app_1/views.py에 새로운 url을 호출할 때 나올 함수를 선언하였다.

    django_project_1/django_project_1/urls.py에 django_app_1의 views를 import 한 이후에 path와 url을 추가하고, views.py에서 만든 함수를 연결하고 실행한다.

Path 추가하는 화면

3. 실행결과 Error : ModuleNotFoundError: No module named 'django_project_1.django_app_1'

    원인은 django_project_1안에 django_project_1라는 같은 이름의 Project가 있기 때문이다.

    이렇게 되면 경로를 찾을 수 없게 되는데, 에러 수정을 위해서는 같은 이름 중 하나는 수정해야 하므로, Project이름을 django_pro_1(원하는 이름)로 수정한다.

4. 수정방법은 이름을 바꾸고자 하는 Project에서 우클릭, Refactor, Rename을 클릭하면 Rename창이 뜬다.

    원하는 이름으로 수정하고 Refactor를 누른다. 그러면 하단에 수정될 파일 개수가 나오고, 확인 후 Do Refactor를 누르면 참조하고 있던 것들이 모두 수정된다.

Refactor하는 화면

5. 다시 실행하면 아래와 같이 실행된다.

App이 실행된 화면

6. 실행이 안될 경우, django_project_1(수정 후 명칭 : django_pro_1)/setting.py과 manage.py의 내용을 수정한다.

  - setting.py : ROOT_URLCONF = 'django_pro_1.urls' , WSGI_APPLICATION = 'django_pro_1.wsgi.application'

  - manage.py : django_pro_1.settings'

  위의 2개만 수정해도 당장은 실행되지만, asgi.py, wsgi.py도 수정을 해야 한다.

 

(참고) HttpResponse

- 간단하게 설명하자면 urls.py에서 정리된 Url을 요청(Request)하면 응답(Response)이 오는 구조인데, Request는 함수에 첫 번째 인자로 전달하고, Response는 HttpResponse 또는 JsonResponse로 전달받는다. 그렇기 때문에 별도로 Html파일을 만들지 않고도 페이지를 확인할 수 있다.

728x90
반응형
LIST
728x90
반응형
SMALL
Python, Django, Anaconda, PyCharm을 사용하여 프로젝트 구성하는 방법

 

■ Python, Django(프레임워크), Anaconda(가상환경 버전관리)를 사용하여 프로젝트를 만들기에 앞서, 이 3가지 프로그램이 설치가 되어 있지 않으면 먼저 설치하도록 한다. 설치 방법은 다음과 같다.

1. Python 다운로드 사이트 : https://www.python.org/downloads/

2. Download Python 3.11.3을 클릭, 설치 시 주의사항은 [Add Python.exe to PATH]에 체크를 꼭 해줘야 한다.

    체크를 해주지 않으면 환경변수가 추가되지 않아, Python을 실행할 때 항상 Python이 설치된 경로에 가서 실행해야만 하는 번거로움이 생긴다.

    실수로 체크를 하지 않았다면, 수동으로 추가하는 방법도 있으니, 다른 블로그를 참고하길 바란다.

Python 설치화면

3. Anaconda 다운로드 사이트 : https://www.anaconda.com/download/

4. Download 버튼을 클릭, 설치 시 주의사항은 [Add Anaconda3 to my PATH environment variable] 체크란인데,

    Python PATH를 설정하고 설치한 경우에는 경로 충돌이 일어날 수 있으므로, 아래 이미지와 같이 체크를 해제한 상태에서 설치를 진행해야 한다. 

Anaconda 설치화면

5. PyCharm 다운로드 사이트 : https://www.jetbrains.com/ko-kr/pycharm/download/#section=windows

6. Community에 있는 다운로드를 클릭한다. 

PyCharm 다운로드 화면

7. PyCharm 설치 시 주의사항은 아래 이미지 옵션 체크 부분인데 기본적으로 모두 체크가 안되어 있지만, 전부 체크를 하고 설치를 진행하면 된다.

    PATH는 앞서 말했듯 환경변수에 대한 내용으로 꼭 체크를 하도록 한다.

PyCharm 설치화면

 설치가 완료되었으면, Python, Django(프레임워크), Anaconda(가상환경 버전관리)를 사용하여 프로젝트를 생성한다.

1. PyCharm 실행 후, New Project를 클릭하면, 아래 우측 이미지로 넘어가는데, Anaconda를 이용하여 가상환경 버전관리를 하기로 했으므로,

    New environment using을 Conda로 변경하고, 개발환경에 맞는 Python version을 선택한다.

    [Make available to all projects]는 다른 프로젝트에서도 이 가상환경을 사용하고 싶을 때 체크한다.

PyCharm 프로젝트 생성

2. 프로젝트를 생성했으면, 이제 장고를 설치한다. 아래 이미지 왼쪽 사각형안의 터미널을 클릭하고, 명령어를 입력한다.

    - Django 설치 명령어 : pip install django

초기 프로젝트 생성 화면

3. 장고 설치가 완료되었으면, 차례로 DjangoProject 및 DjangoApp을 생성한다.

    - DjangoProject 생성 명령어 : django-admin startproject django_project_1  (django_project_1 : 프로젝트 이름)

    - DjangoApp 생성 : manage.py를 사용하기 때문에 manage.py가 있는 경로로 맞춰줘야 한다.

    - 명령어 cd django_project_1을 입력, 경로가 변경된 걸 확인 후, 명령어 python manage.py startapp django_app_1 입력하여

      DjangoApp을 생성한다. (django_app_1 : 앱 이름)

4. 아래 이미지는 Django프로젝트 및 App이 생성된 화면이다.

Django Project, App이 생성된 화면

5. DjangoProject 실행 명령어 : python manage.py runserver

    - 실행하면 위에 이미지와 같이 http://127.0.0.1:8000/ 가 나오는 것을 볼 수 있다.

    - IP를 클릭해서 아래와 같은 이미지가 나오면 DjangoProject가 성공적으로 만들어진 것이다.

Django Project 실행화면

 

(참고) 명령어 python manage.py runserver를 치지 않고, 버튼클릭 한 번으로 실행하는 방법

- 아래 이미지 가장 상단에 main우측 ↓화살표 버튼 ☞ Edit Configurations...(아래 이미지에는 없음) ☞ 왼쪽 + 버튼 ☞ Script path 우측 폴더버튼

   을 클릭하여 manage.py를 찾아서 선택 ☞ Parameters : runserver 입력 ☞ 확인 ☞ main우측 ▷ 버튼을 눌러 실행

runserver 설정화면

 

728x90
반응형
LIST
728x90
반응형
SMALL

■ Django(장고)에 대한 설명

1. Python(파이썬)을 기반으로 한 웹 프레임워크이다.

2. Model(모델), Template(템플릿), View(뷰)로 구성된 MTV 패턴을 사용하고 있다. (MVC 패턴과 유사)

3. SQL을 사용하지 않고 Database에서 사용하는 테이블(RDBMS)을 자동으로 대응해 주는 ORM(Object-Relational Mapping)을 통하여 코드를 작성할 수 있다.

4. 많은 보안 기능을 내장하고 있어, 보안성이 우수하다.

5. 다양한 타사 패키지 및 플러그인을 지원한다.

6. 2023년 Laravel, Ruby on Rails에 이어 3위를 차지할 정도로 인기가 많은 프레임워크이다.

7. 대표적인 사이트의 예로 Instagram, JetBrains 등이 있다.


■ 장점

1. 설치가 간편하다.

2. 포럼, 블로그, 소셜 미디어 등 수많은 개발자 커뮤니티를 가지고 있어 검색 가능할만한 자료가 많다.

3. 다른 프레임워크보다 강력하고 많은 라이브러리를 사용할 수 있다. 그렇기 때문에, 많은 코딩 없이 프로그램을 완성시킬 수 있다. 초보자들도 다가가기 편한 프레임워크다.

4. IDE(통합 개발 환경)가 훌륭하다. (PyCharm, Visual Studio Code 등)

5. 프로젝트를 만들면 별도의 개발 없이 자동으로 관리자 화면을 제공한다.

6. App 단위로 구성이 되어 있어, 독립적으로 작업할 때 매우 쉽다.

7. ORM을 제공하기 때문에 쿼리 없이 데이터를 관리할 수 있다.

8. 많은 보안기능을 제공하고 있으며, 설정에도 매우 간편하다.

9. 웹 서버를 포함하고 있어서 개발과정에 별도로 웹서버가 없어도 된다.

10. 개발과정에서는 소스가 수정되면, 서버를 다시 시작하지 않아도 바로 적용이 된다.

11. Python을 기본으로 개발한다면, Python에서 제공하는 모든 기능을 활용할 수 있다. (Docker 구성 및 API 연계 등)


■ 단점

1. 자료는 많지만, 아직 한글 문서가 많은 편은 아니다.

2. 소형 프로젝트에는 사용하기 무겁고 기능이 많아 부적합하다.

3. 장점에도 소개되었지만, 내부에 구현된 기능이 많다는 것은 곧, 자유롭게 코딩할 수 있는데 한계가 있으므로, 코딩하는데 어려움을 겪을 수 도 있다. 또한 Django에서 문제가 생겼을 때, Python코딩으로 문제를 해결하는 경우가 발생할 수 있다.

4. ORM을 사용한다고 했을 때, 복잡한 데이터 구조(Join이 많은 경우)나 Procedure(프로시져)를 많이 사용한 곳에는 적합하지 않을 수 있다.

5. Python의 단점을 그대로 가져온다. (Python은 타입을 선언하지 않아도 실행되기에, 타입을 검사하려면 시간이 걸릴 수밖에 없다. 또한, 인터프리터 언어(한 줄씩 읽어 내려가며 실행하는 언어)이기 때문에 상대적으로 컴파일하는 프로그램보다 편하지만 빠르지는 않다.)


■ Django(장고)를 선택한 이유

1. Python에서 제공하는 모든 기능을 활용할 수 있다.

2. Django는 Python을 기반으로 만들어진 프레임워크이기 때문에, AI(인공지능) 개발에 유용하다.


728x90
반응형
LIST

+ Recent posts