반응형

Numpy Sum 함수

말 그대로 각각의 값들을 더하는 함수입니다.

x = np.array([[1,2], [3,4]])
print(x, end='\n\n')
print(np.sum(x), end='\n\n')
# axis = 0 열 기준으로 계산 // axis = 1 행 기준으로 계산
print(np.sum(x, axis = 0), end='\n\n') # 1 + 3 = 4 , 2 + 4 = 6 
print(np.sum(x, axis = 1), end='\n\n')
print(np.cumsum(x), end='\n\n')


# 출력 결과

[[1 2]
 [3 4]]

10

[4 6]

[3 7]

[ 1  3  6 10]

 

해당 소스코드에서 SUM 함수는 각각의 행과 열에 있는 값들을 다 더한 것을 확인하실 수 있습니다.

행과 열을 각각 따로 더하고 싶다면 뒤에 axis 조건을 주어 0인 경우 열을 기준으로 더하고 1인 경우 행을 기준으로 더합니다.

 

Numpy 집합

각각의 집합관련 함수는 다음과 같습니다.

unique(x) : 배열 값들 중 중복된 원소 제거하고, 유일한 원소를 반환

intersect1d(x, y) : 두 배열 x, y 의 교집합을 반환

union1d(x, y) : 두 배열 x, y의 합집합을 반환

setdiff1d(x, y) : x 배열 로 부터 배열 y를 뺀 차집합을 반환

setxor1d(x, y) : x, y 배열의 합집합에서 교집합을 뺀 대칭차집합을 반환

 

x = np.array(['a','b','a','c'])
y = np.array(['a','d','e'])

# unique
print('unique', ' ',np.unique(x), end='\n\n') # 중복되는 값은 1개만 출력

# 차집합
print('setdiff1d ', np.setdiff1d(x,y), end='\n\n')

print(set(x), end='\n\n') # 

# 교집합 합집합
# 교집합 , 중복되는 값만 출력 assume_unique 작성시 중복가능
print('intersect1d ' , ' ', np.intersect1d(x, y, assume_unique=True), end='\n\n')
# 합집함 , 중복을 허용하지 않고 5개의 값 다 출력
print('union1d ' , ' ' , np.union1d(x, y), end='\n\n') 



# 출력 결과

unique   ['a' 'b' 'c']

setdiff1d  ['b' 'c']

{'b', 'c', 'a'}

intersect1d    ['a' 'a']

union1d    ['a' 'b' 'c' 'd' 'e']

 

 

* arange함수와 reshape 함수

 

arange 함수는 range는 리스트로 반환합니다. arange 함수는 range 함수와 사용하는 방법은 동일하나 리턴을 배열로합니다.

 

reshape 함수는 예를 들어 1차원 배열로 출력한 것을 reshape 함수를 통해 2차원 배열로 변경하는데 사용되곤 합니다.

 

aa = np.arange(12) # 1차원 배열
bb = aa.reshape(3,4) # 1차원 배열인 a를 2차원 배열로 변경
print(aa, end='\n\n') # 1차원 배열
print(bb, end='\n\n')

# 출력 결과

[ 0  1  2  3  4  5  6  7  8  9 10 11]

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
반응형
반응형

Numpy 배열 연산

 

# 배열 연산
import numpy as np

x = np.array([[1,2], [3,4]])
y = np.arange(5, 9).reshape((2,2)) 
y = y.astype(np.float32)
print(x, type(x), x.dtype)

print(y, type(y), end='\n\n')

print(x+y, end='\n\n') # + 연산

print(np.add(x,y), end='\n\n') # + 연산

print(np.subtract(x,y), end='\n\n') # - 연산

print(x-y, end='\n\n') # - 연산

print(np.divide(x,y), end='\n\n') # / 연산

print(x*y, end='\n\n') # * 연산


# 출력 결과

[[1. 2.]
 [3. 4.]]
 
[[5. 6.]
 [7. 8.]]

[[ 6.  8.]
 [10. 12.]]

[[ 6.  8.]
 [10. 12.]]

[[-4. -4.]
 [-4. -4.]]

[[-4. -4.]
 [-4. -4.]]

[[0.2        0.33333334]
 [0.42857143 0.5       ]]

[[ 5. 12.]
 [21. 32.]]

 

행렬의 연산은 자리끼리 연산해주기 때문에 쉽게 해결하실 수 있습니다.

 

연산 결과를 보기에 앞서, reshape 라는 함수가 존재합니다.

 

reshape 함수란 배열의 차원의 크기를 변경하는 방법으로, 배열의 요소의 개수는 동일하고 배열의 차원만 변경해줍니다.

 

덧셈 -> add(배열1, 배열2) , add 대신 + 사용 가능합니다.

뺄셈 -> subtract(배열1, 배열2) , subtract 대신 - 사용 가능합니다.

곱셉 -> multiply(배열1, 배열2) , multiply 대신 * 사용 가능합니다.

나눗셈 -> divide(배열1, 배열2) , divide 대신 / 사용 가능합니다.

 

Numpy 벡터의 내적

 

벡터의 내적 함수에 대하셔 내적 계산시에는 dot 메소드를 필요로합니다.

 

형태는 다음과 같습니다.

z = dot(x,y)
z = dot(x,y,dim)

 

- 내적 함수를 계산하려면 열과 행이 일치하여야하고 만약, 일치하지 않는다면 가공을 필요로 하고 T(transform)를 이용합니다.

 

- 2차원 배열을 벡터 계산하면 1차 배열의 결과가 나오고, 1차 배열을 벡터계산하면 스칼라 결과가 출력됩니다.

 

import numpy as np
v = np.array([9,10])
w = np.array([11,12])

x = np.array([[1,2], [3,4]])
y = np.arange(5, 9).reshape((2,2))

print(v.dot(w), end='\n\n') 
print(np.dot(v, w), end='\n\n') 

print(np.dot(x, y), end='\n\n')


# 출력 결과

219

219

[[19. 22.]
 [43. 50.]]

 

v.dot(w) 의 경우 v와 w의 내적함수를 구한 것으로 (9 *11) + (10*12) 를 하여 219가 출력된 것입니다.

 

위와 동일한 식으로 np.dot(v, w) 가 있습니다. 위와 계산 방식은 동일하기에 출력 결과도 같습니다.

 

2차원 배열의 경우

 

( 1 * 5 ) + ( 2 * 7 ) = 19 값은 1행 1열에 저장

 

( 1 * 6 ) + ( 2 * 8 ) = 22 값은 1행 2열에 저장

 

( 3 * 5 ) + ( 4 * 7 ) = 43 값은 2행 1열에 저장

 

( 3 * 6 ) + ( 4 * 8 ) = 50 값은 2행 2열에 저장이 됩니다.

 

 

반응형
반응형

배열 관련 포스팅

 

2020/05/28 - [python] - [python] Numpy 데이터타입, 메모리저장, 배열

 

[python] Numpy 데이터타입, 메모리저장, 배열

Numpy 란? C언어로 개발되었으며, 계산을 위한 라이브러리로서 다차원 배열을 처리하는데 필요한 기능을 제공합니다. Numpy 데이터 타입 # numpy : ndarray import numpy as np nn = [1, 2, 3.5] nn1 = (6,7,8,9)..

lightchan.tistory.com

 

 

 

Numpy 슬라이싱

a = np.array([1,2,3,4,5])
print(a, type(a), end='\n\n')
print(a[1], end='\n\n')
print(a[1:5:2], end='\n\n')
print(a[-5:-2], end='\n\n')
print(a[1:], ' ' , a[:3], end='\n\n')

print('==========================')

a = np.array([[1,2,3,4], [5 ,6,7,8], [9,10,11,12]])
print(a, a.shape, end='\n\n')
#print(a[:])
print(a[1:], end='\n\n')
print(a[0], a[0][0],a[0,0], a[[0]], end='\n\n')
print(a[0,0], end='\n\n')


print(a[1:], end='\n\n')
print(a[1:, 0:2], end='\n\n')


b = a
print(b, end='\n\n')


# 출력 결과

[1 2 3 4 5] <class 'numpy.ndarray'>

2

[2 4]

[1 2 3]

[2 3 4 5]   [1 2 3]

[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]] (3, 4)

[[ 5  6  7  8]
 [ 9 10 11 12]]

[1 2 3 4] 1 1 [[1 2 3 4]]

1

[[ 5  6  7  8]
 [ 9 10 11 12]]

[[ 5  6]
 [ 9 10]]

[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]

 

소스코드의 일부를 보시면 a[값1:값2] 로 작성되어있는 의미는 다음과 같습니다.

 

- 1차원 배열의 자료를 출력하고, 값1+1로 시작하여 값2의 범위까지 출력하는 것을 뜻합니다.

 

그 밑의 출력 문장을 보시면 a[값1:값2:값3] 으로 값3까지 있는 문장에서는 값3만큼 띄어넘어 출력하는 것을 뜻합니다.

 

- 여기서는 1:5 만 출력한다면 2 3 4 5가 출력되겠지만 값3에 2를 넣엇기때문에 2 4 가 출력됩니다.

 

shape 함수는 해당하는 배열이 몇행 몇열의 배열인지 출력해주는 함수입니다.

 

2차원 배열에서는 행과 열로 구성되고 있기 때문에 [값1:값2 , 값3,값4] 의 범위로 지정하게 됩니다.

 

a[값1 : ] 의 경우는 값1의 행부터 마지막 행까지 출력되는 것을 의미하게 됩니다.

 

Numpy 복사하기

 

a = np.array([[1,2,3,4], [5 ,6,7,8], [9,10,11,12]])

b = a # 이건 주소치환
b[0][0] = 100
print(a)
print()
print(b)
print('**' * 10)
print()
c = np.copy(a) # 원본을 가지고 또 다른 배열주소 하나 만들어서 저장
c[0][0] = 200
print(a)
print('**'*10)
print(c)

a 배열을 만든후 주소 치환을 이용하여 b에 그대로 복사하여 동일하게 출력 된 것을 확인 할 수 있습니다.

 

그 다음 np.copy() 를 이용하여 c 에 2차원 배열 a를 다른 주소를 통하여 c에 복사하게 됩니다.

 

여기서 복사한 2차원 배열 c 의 값이 바뀌더라도 기존 a 배열에는 영향이 없습니다.

 

Numpy 의 서브Array

 

d=a[:2, 1:3]
print(a, end='\n\n') # 2   3 이 부분을 서브 array라고 한다
print(d, end='\n\n') # 6   7

print(a) 


# 출력 결과

[[100   2   3   4]
 [  5   6   7   8]
 [  9  10  11  12]]

[[2 3]
 [6 7]]

[[100   2   3   4]
 [  5   6   7   8]
 [  9  10  11  12]]

d 배열에 a 배열의 1 ~ 2행과 2 ~ 3 열의 값을 d 배열에 저장하였습니다.

 

그에따른 결과는 다음과 같으며 이것을 서브배열이라고 칭합니다. 이후 다시 a 배열을 출력해보면

 

기존 a 배열에는 영향이 없는 것을 알 수 있습니다.

 

그 외 추가 예제

 

a = np.array([[1,2,3,],[4,5,6],[7,8,9]])
r1 = a[1, :] 
print(r1)
print(r1, r1.shape)
print()

r2 = a[1:2, :]
print(r2, r2.shape)
print()


# 출력 결과

[4 5 6]
[4 5 6] (3,)

[[4 5 6]] (1, 3)

 

위에서 설명 드렸던 것처럼 .shape() 함수는 행렬의 차원을 개념으로 표현하는 것입니다.

 

여기서 r1 의 a[1, :] 는 a[1,] 과 동일한 의미로 해석 될 수 있습니다. 출력이 [4 5 6] 이지만 (3, )과 같이 출력 되는 이유는

1차원 배열 형태로 출력하였기 때문입니다.

 

그 차이를 비교하기 위해 r2 를 확인해보시면 쉽게 이해하실 수 있습니다. 

 

위에 설명을 보시면 2차원 배열의 경우 (값1 : 값2 , 값3 : 값4 ) 로 범위를 지정하여 이번에는 (1, 3) 과 같이 출력 된 것을 알 수 있습니다.

반응형
반응형

2020/05/28 - [python] - [python] Numpy

 

[python] Numpy

Numpy 란? C언어로 개발되었으며, 계산을 위한 라이브러리로서 다차원 배열을 처리하는데 필요한 기능을 제공합니다. Numpy 데이터 타입 # numpy : ndarray import numpy as np nn = [1, 2, 3.5] nn1 = (6,7,8,9)..

lightchan.tistory.com

 

Numpy에서 zeros / ones / full / eye 함수 

 

import numpy as np

c = np.zeros((2, 2))
print(c, end = '\n\n')

d = np.ones((2,2))
print(d, end = '\n\n')
d = np.full((2,2 ), 10)
print(d, end = '\n\n')

e = np.eye(3) # 3행 3열짜리 단위행렬
print(e, end = '\n\n')


# 출력 결과

[[0. 0.]
 [0. 0.]]

[[1. 1.]
 [1. 1.]]

[[10 10]
 [10 10]]

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

np.zeros((2,2)) 는 2 행 2 열 짜리 2차원 배열을 0 으로 초기화 하겠다는 의미입니다.

 

np.ones ((2,2)) 는 2행 2열 짜리 2차원 배열을 1로 초기값을 설정해주는 것입니다.

 

np.full ((2,2), 10) 의 경우는 2행 2열 짜리 2차원 배열을 10으로 초기화 하겠다는 의미입니다.

 

저 위치에 다른 정수를 넣을 경우 해당 정수로 초기화하며 출력합니다.

 

np.eye(3) 의 경우 단위 행렬을 만드는 함수로 안의 정수값에 해당하는 단위 행렬을 출력해줍니다. 여기서는 3,3ㄷ의 단위 행렬을 출력해줍니다.현재는 3단위 행렬이지만, np.eye(2)를 할 경우, 2x2 행렬이 만들어집니다.

 

 

Numpy 난수 값 얻기

np.random.seed(0) 

print(np.random.rand(3), end = '\n\n') 

print(np.random.randn(5), end = '\n\n')

print(np.random.randint(3, size=6), end = '\n\n')
print(np.random.randint(3, size=(3,4)), end = '\n\n')
print(np.random.randint(3, size=(3,4,5)), end = '\n\n')


print(list(range(3)), end = '\n\n')
print(np.arange(3), end = '\n\n')

f = {i:np.random.randn() for i in range(3)}
print(f, end = '\n\n')



# 출력 결과

[0.5488135  0.71518937 0.60276338]

[-2.2683282   1.33354538 -0.84272405  1.96992445  1.26611853]

[2 0 1 1 1 1]

[[0 1 0 0]
 [1 2 0 2]
 [0 1 1 2]]

[[[0 1 1 1 0]
  [2 0 2 2 0]
  [2 0 0 0 1]
  [1 2 0 0 1]]

 [[0 1 2 2 0]
  [1 1 1 1 2]
  [2 2 0 2 1]
  [0 1 2 0 0]]

 [[2 0 0 0 0]
  [0 0 2 0 2]
  [1 1 1 0 1]
  [1 1 0 1 2]]]

[0, 1, 2]

[0 1 2]

{0: -0.5058765397605117, 1: 0.42539339846964996, 2: -0.027971183469780222}

 

 

np.random.seed(0) 란 임의의 시드를 생성합니다. seed 안에 값을 넣으면 항상 같은 결과를 반환합니다

 

np.random.rand(3) 란 난수 발생 균등분포를 따르기 때문에 음수 값은 출력되지 않습니다.

 

np.dandom.randn(5) 란 표준 정규분포를 따르는 난수를 발생시킵니다. rand() 와는 다르게 음수도 출력합니다.

 

맨 처음 seed에 0을 넣줬기 때문에 현재는 반복하여 출력하여도 같은 결과만 출력하게 됩니다.

 

매 출력 다른 결과를 원하신다면 seed(0)에서 0을 빼시면 됩니다.

 

np.random.randint()는randint(정수값)의 범위 내에서 균일분포의 정수난수를 발생 시킵니다. 여기서

 

(np.random.randint(3, size=6) 는 0~2 사이의 정수난수를 발생기키고 size는 6개를 받도록 하였습니다.

 

np.random.randint(3, size=(3,4) 의 경우는 범위는 위와 동일하지만, size는 2행 3열의 2차원 배열을 출력합니다.

반응형
반응형

Numpy 란?

C언어로 개발되었으며, 계산을 위한 라이브러리로서 다차원 배열을 처리하는데 필요한 기능을 제공합니다.

 

 

Numpy 데이터 타입

# numpy : ndarray
import numpy as np

nn = [1, 2, 3.5]
nn1 = (6,7,8,9)
ss1 = ['tom', 'james', 'oscar']
ss2 = {'a' , 'b', 'c'}

print(nn, ' ', type(nn))
print(nn1, ' ' , type(nn1))
print(ss1, ' ' , type(ss1))
print(ss2, ' ' , type(ss2))

# 출력 결과

[1, 2, 3.5]   <class 'list'>
(6, 7, 8, 9)   <class 'tuple'>
['tom', 'james', 'oscar']   <class 'list'>
{'a', 'b', 'c'}   <class 'set'>

 

변수에 할당한 데이터와 출력 된 값 및 데이터 타입 형태를 보면 들어간 타입의 형태로 출력 되는 것을 알 수 있스니다.

 

서로 성격이 다른 타입일 경우 상위 타입을 따라서 출력됩니다.

 

- 바깥쪽이 가장 큰 상위 타입

str ( somplex ( float ( int ) ) )

 

Numpy 메모리 저장

 

파이썬과 Numpy가 차지하는 메모리에는 차이가 있다.

 

파이썬은 값에 상관없이 다 다른 메모리를 차지하는 특징이있습니다.

li = list(range(1,10))
print(li) # list 형태

print(id(li[0]), id(li[1]), id(li[2]), id(li[3]), id(li[4]), id(li[5]), id(li[6]), id(li[7]), id(li[8]))


# 출력 결과

[1, 2, 3, 4, 5, 6, 7, 8, 9]
10914496 10914528 10914560 10914592 10914624 10914656 10914688 10914720 10914752

 

출력 결과를 보시면 id 값이 전부 다른 것을 확인 할 수 있습니다.

 

반면, Numpy 의 경우 C의 배열을 사용하기 때문에 하나의 메모리 안에 데이터를 하나씩 쌓아두는 특징을 가지고 있습

니다.

 

 

numpy_arr = np.array(li)

print(id(numpy_arr[0]), id(numpy_arr[1]), id(numpy_arr[2]), id(numpy_arr[3]), id(numpy_arr[4]))


# 출력 결과

139921874137520 139921874137520 139921874137520 139921874137520 139921874137520

출력 되는 id의 값이 전부 동일한 것을 확인할 수 있습니다.

 

 

결과적으로, 데이터 분석을 할 경우 들어오는 데이터의 양이 많기 떄문에 python 의 list 를 사용하는 것이 아니라

 

Numpy의 array 배열을 사용하는 것이 더 적합한 것을 알 수 있습니다.

 

 

추가 - 위에 특징들로인해 python의 list 값에 *값 을 해주면 list를 값 만큼 반복하지만 Numpy 의 경우 각 요소들에 * 값

 

을 해주는 특징을 가집니다.

print('a ' * 10)

for i in li:
  print(i*10, end = ' ')
  

# 출력 결과

a a a a a a a a a a 
10 20 30 40 50 60 70 80 90 

 

Numpy 배열

넘파이에서 사용하는 배열은 주로 벡터와 행렬을 사용하는 선형대수 계산에 사용됩니다.

 

1차원 배열 - 리스트를 넣으면 배열로 변환

exarr = np.array([1,2,3,4,5,6,7,8,9])


# 출력 결과

[1 2 3 4 5 6 7 8 9]   <class 'numpy.ndarray'>

 

2차원 배열 - 리스트의 리스트(list of list)를 이용하는 경우 2차원 배열을 생성할 수 있습니다. 가로는 행의 개수 세로는 열의 개수가 됩니다.

 

exarr1 = np.array([[1,2,3,4],[5,6,7,8]])
print(exarr1, ' ' , type(exarr1))


# 출력 결과

[[1 2 3 4]
 [5 6 7 8]]   <class 'numpy.ndarray'>

Numpy 에서의 배열은 다른 배열과는 다른 차이점을 가지고 있습니다.

 

예를들어 아래 소스에서도 보여드리겠지만, arr[0] 과 arr[[0]] dms 다른 점을 가지고 있습니다.

 

arr[0] 은 1차원 배열 , arr[[0]] 은 2차원 배열이라는 특징을 가지고 있습니다.

 

import numpy as np

arr1 = np.array([[10,20,30], [40,50,60]], dtype='float32')
print(type(arr1), ' ' , arr1.dtype, ' ' , arr1.shape, ' ' , arr1.ndim, ' ' , arr1.size, end = '\n')

print(arr1, end = '\n\n')

print(arr1[0,0], arr1[0, 1], end = '\n\n')
arr1[0] = 10
print(arr1[0,1], arr1[0,2], end = '\n\n')

print('-------------------------')

print(arr1, end = '\n\n')

print(arr1[[0]], end = '\n\n')

print(arr1[[0,1]], end = '\n\n')

print(arr1[0], end = '\n\n')


# 출력결과

<class 'numpy.ndarray'>   float32   (2, 3)   2   6
[[10. 20. 30.]
 [40. 50. 60.]]

10.0 20.0

10.0 10.0

-------------------------

[[10. 10. 10.]
 [40. 50. 60.]]

[[10. 10. 10.]]

[[10. 10. 10.]
 [40. 50. 60.]]

[10. 10. 10.]

 

 

 

위에 소스를 보시면 arr1[0]은 1차원 배열로 list 형태인 것을 알 수 있으며,

 

그 다음 줄 arr1[[0]] 인 경우는 arr1[0]과 다르게 0 행 1열의 2차원 배열을 의미하며 [[10. 10. 10]] 을 출력하였습니다.

 

 

반응형
반응형

GET과 POST의 공통점서버에 Request 요청을 하는 메소드라점입니다.

 

Ex) 홈페이지에 로그인 등의 작업을 처리할때 사용자(클라이언트)가 폼을 작성후 요청(Request)하는 동작을 의미합니다.

 

GET이 POST와의 차이점클라이언트의 요청이 URL 뒤에 추가되어서 요청되는 점입니다.

 

GET 방식(가져온다) 의 특징으로는 SELECT 쿼리문과 유사한 성격을 가지며, POST보다 전송속도가 빠르다.

왜냐하면, GET 방식은 캐싱(한번 접근 후, 또 요청할 시 빠르게 접근하기 위해 데이터를 저장시켜 놓는다) 에 의하여 빠른효과를 나타냅니다.

 

ex) www.xxx.com?id=aaa&bbb=111 과 같이 작성됩니다. 

 

위 예와 같이 도메인 뒤에 ?가 붙여지며 ?  뒤는 데이터가 들어온다는 것을 의미합니다.

 

URL 형태로 출력되기 때문에 특정 페이지를 타인이 접속 가능하며, URL의 길이가 한정되어있기 때문에 보내는 양의 한계가 존재합니다.

 

반면, POST 방식(수행한다)URL이 아닌 BODY에 데이터를 넣어서 숨겨진 상태로 전송해주는 방식입니다.

보통 HTML에서 form 형태를 이용하여 submit을 사용합니다.

 

<h3> * 방명록 글쓰기 *</h3>
<form action="/guest/insertok" method="post"> <!-- 위조 방지로 다음 문장 작성 --> {% csrf_token %} 
  <table>
    <tr>
      <td>제목</td>
	  <td><input type="text" name="title" size="50"></td>
	</tr>
	<tr>
	  <td>글내용</td>
	  <td><textarea rows='5' cols='50' name="content"></textarea></td>
	</tr>
	<tr>
	  <td colspan="2" style="text-align: center;">
	  <input type="submit" value = "등록">
	  </td>
    </tr>
	</table>
</form>

위 작성한 Template 소스중 하나입니다. 여기서 제목 내용을 작성후 submit을 누르면 아래의 view를 거치도록 되어있습니다.

 

Django에서 POST 방식을 수행하고 싶은 경우, 사이버공격으로부터 방어하기 위해 Spring 프레임워크와 다르게 form 태그 끝에 {% csrf_token %} 을 작성해주어야한다.

 

csrf란 특정 사용자를 대상으로 하지 않고, 불특정 다수를 대상으로 로그인된 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록, 송금 등)를 하게 만드는 공격을 뜻합니다.

def InsertOkFunc(request):
    if request.method == 'POST':
        #print(request.POST.get('title')) # 밑과 같은 뜻
        #print(request.POST['title'])
        Guest(
                title = request.POST.get('title'), #.POST['title'],
                content = request.POST.get('content'),
                regdate = datetime.now()
                
        ).save() # ORM추가
        return HttpResponseRedirect('/guest') # 추가후 목록 보기로 돌아감
    else:
        return HttpResponseRedirect('/guest/insert')

 

View에서 POST방식으로 request 받은 내용들을 ORM 함수중 하나인 .save() 를 거쳐서 DB에 저장되도록 하였습니다.

 

반응형

'Django' 카테고리의 다른 글

[Django] URLS  (0) 2020.05.21
[Dango] DB 연결 및 Migrate  (0) 2020.05.21
[Django] Model  (0) 2020.05.20
[Django] Template  (0) 2020.05.19
[Django] View  (0) 2020.05.19
반응형

2020/05/19 - [Django] - [Django] Application

 

[Django] Application

각각의 역할에 대해 간단하게 정리한 내용은 아래 포스팅글 참고해주세요 2020/05/18 - [Django] - Django 란 ? Django 란 ? 각각의 .py 파일들이 하는 역할은 다음과 같습니다. urls.py - URL 요청을 처리, URL을.

lightchan.tistory.com

2020/05/19 - [Django] - [Django] Template

 

URLS 를 어떤 용도로 사용하는지 이전 포스팅을 참고하면 좋을 것 같습니다.

 

urls의 형태는 다음과 같습니다.

 

urlpatterns = [
    path(url경로, view, {key:values}, name),
]

path의 1번째 위치는 url경로,

2번째 위치는 출력할 view,

3번째 위치는 딕셔너리 형태인 {key:values}

4번째 위치는 장고의 위치의 상관 없이 참조할 이름을 정해줍니다.

앞의 2개는 필수지만 뒤에 2개는 옵션 선택사항입니다

 

아래 사진을 보시면 urls가 2개가 생성되어있습니다. 그 이유는 프로젝트에 여러개의 APP이 존재하는데 모든 urls의 내용을 프로젝트 root의 urls에 다 넣으면 복잡해지고 찾기 힘들어 지기 때문에 각각의 APP 안에 urls를 만들어주면 보다 더 효율적으로 사용할 수 있습니다.

 

 

프로젝트의 root urls.py 의 url 매핑을 다음과 같이 해줍니다.

urlpatterns = [
    path('admin/', admin.site.urls),
    
    path('', views.Main), # myboard의 views의 Main
    path('board/', include('myboard.urls')),

]

3번째에 작성되어있는 path 경로를 보시면 

path('board/, include('myboard.urls')) 라고 작성되어있습니다.

이 뜻은 url뒤에 board/를 만나면 myboard 폴더의 urls.py 를 찾아가는 의미가 되겠습니다.

 

 

 

반응형

'Django' 카테고리의 다른 글

[Django] GET & POST 방식 웹 출력  (0) 2020.05.21
[Dango] DB 연결 및 Migrate  (0) 2020.05.21
[Django] Model  (0) 2020.05.20
[Django] Template  (0) 2020.05.19
[Django] View  (0) 2020.05.19
반응형

앞서 포스팅한 APP 생성, Template 설정, Model 구성이 완료가 되었다면,

 

DB 설정 및 makemigrations -> migrate 과정을 수행해주도록 하겠습니다.

 

 

- makemigrations , migrate 작업

 

모델에 만든 클래스들에 맞는 스키마를 생성하고 수정 가능하도록 하기 위해 다음과 같은 명령어를 차례대로 실행합니다

해당 명령어를 수행하면 APP 하위 폴더에 있는 migrations 폴더에 파일이 생성된 것을 확인 하실 수 있습니다.

 

python manage.py makemigrations
python manage.py migrate

 

0001_inital.py

 

- DB 설정 변경

 

urls.py 로 가서 다음과 같은 부분을 변경해주도록 합니다.

 

 

ALLOWED_HOSTS = [] 부분에는 자신의 ip 또는 127.0.0.1 을 기재 해주시거나 둘다 해당 가능하게 하고 싶다면 위의 사진처럼 '*'로 해주도록 합니다.

 

INSTALLED_APPS = [] 영역에는 자신이 만든 APP 이름을 작성해주도록 합니다.

 

 

다음으로 이 부분을 수정해주도록 합니다. 현재는 프로젝트 생성시 기본을 sqlite3으로 지정했기 때문에 다음과 같이 작성되어있습니다.

 

저는 다음과 같이 수정하였습니다.

 

 

'ENGINE' 영역 mysql 또는 mariadb 인경우 저처럼 작성해주고, 오라클의 경우에는 mysql 대신 oracle이라고 작성해주시면 됩니다.

'NAME' 에는 자신이 사용할 DB명을 입력해주도록 합니다.

그 외의 것들은 생략하도록 하겠습니다.

반응형

'Django' 카테고리의 다른 글

[Django] GET & POST 방식 웹 출력  (0) 2020.05.21
[Django] URLS  (0) 2020.05.21
[Django] Model  (0) 2020.05.20
[Django] Template  (0) 2020.05.19
[Django] View  (0) 2020.05.19

+ Recent posts