Django 기본 01 - 기본세팅, 휴대폰으로 접속하기

|

AskDjango 수업을 듣고 중요한 내용을 정리하였습니다.

One Project, Multi App 구조

  • 장고 프로젝트 : 장고 프로젝트 rule 에 따라, 파일/디렉토리 구성이 된 디렉토리
  • 장고 앱 : 장고 앱 rule 에 따라, 파일/디렉토리 구성이 된 디렉토리
  • 하나의 장고 프로젝트에 다수의 장고 앱이 존재할 수 있다.
# 프로젝트 생성방법 1 - 최상위 디렉토리 명은 변경 가능하다. 프로젝트 폴더명은 변경하지 않는게 좋다. (변경시 설정 변경 필요)
$ django-admin startproject mysite
$ mv mysite django_project

# 프로젝트 생성방법 2 - django-admin 명령어를 사용할 수 없는 경우
$ python3 -m django startproject mysite

# 앱 생성방법 - 여러개 생성 가능
$ python3 manage.py startapp blog

$ python3 manage.py startapp shop

App/URLConf/ View/Template

urls.py

  • 앱 디렉토리 생성 (상기 코드 참조)
  • 앱을 프로젝트에 등록 (mysite/settings.py) : admin 위에 입력하는 것이 좋음
INSTALLED_APPS = [
'blog',
# 생략
]
  • 앱 폴더 내에 urls.py 파일 생성 후 프로젝트 urls.py와 연결
# 프로젝트 폴더 urls.py
from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^blog/', include('blog.urls')),
]
# 앱 폴더 urls.py
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.post_list),
]
  • 개발 서버 돌리기 (계속 켜놓는게 편하다)
$ python3 manage.py runserver

views.py

from django.shortcuts import render

def post_list(request):
    return render(request, 'blog/post_list.html')

template

  • 경로 : blog/templates/blog/post_list.html
  • 서버 실행후 작성한 template 디렉토리를 서버가 알게하는 방법
    • 서버 강제종료 (ctrl+c) 후 재실행

휴대폰 망을 통해 장고서버 접속하기

ngrok

  • ngrok 사이트
  • Demo without deploying
  • Simplify mobile device testing
  • 사설 네트워크 안의 개발서버를 포트포워딩 등의 설정 없이도, 외부 네트워크에서 접속 가능하도록 한다.
views
ngrok 구동방식

설치 및 실행

설치

  • ngrok를 다운, 압축을 풀어 ngrok 실행파일을 manage.py 가 존재하는 장고 프로젝트 경로로 복사
$ mv ~/Downloads/ngrok .

실행

  • 장고 개발서버를 8000 포트로 (디폴트) 구동
  • ngrok 실행 후 표시되는 http 주소로 휴대폰 브라우저 접속
# 서버구동
$ python3 manage.py runserver 8000
# ngrok 실행
$ ./ngrok http 8000
views
ngrok 실행 - 해당 주소로 휴대폰으로 접속

settings.py 수정

  • settings.py 의 ALLOWED_HOSTS 에 상기 주소를 입력하여 접속을 허용해야한다.
  • * 을 입력하면 모든 도메인에 대해서 접속을 허용한다.
# 서버는 여려개의 도메인을 가질 수 있는데, 그 중에 허용할 도메인을 입력
# ALLOWED_HOSTS = ['f1ee182d.ngrok.io']
ALLOWED_HOSTS = ['*'] # 모든 도메인에 대해서 허용

(참고) 템플릿 모바일뷰 대응하기

  • viewport meta : 배율 x 1.0 고정으로, 유저의 배율 조정을 막는다.
<meta name="viewport" content="width=device-width,initial-scale=1.0,
                               minimum-scale=1.0,maximum-scale=1.0,
                               user-scalable=no" />

level 2. 소수 찾기

|

문제출처

문제

numberOfPrime 메소드는 정수 n을 매개변수로 입력받습니다.

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하도록 numberOfPrime 메소드를 만들어 보세요.

소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.)

10을 입력받았다면, 1부터 10 사이의 소수는 [2,3,5,7] 4개가 존재하므로 4를 반환 5를 입력받았다면, 1부터 5 사이의 소수는 [2,3,5] 3개가 존재하므로 3를 반환

풀이

def numberOfPrime(n):
    num_list = list(range(n+1))
    prime_list = []
    for num in num_list:
        check = 0
        for i in list(range(1,num+1)):
            if num % i == 0:
                check += 1
        if check == 2:
            prime_list.append(num)
    return len(prime_list)



# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(numberOfPrime(10))

풀이 과정

  • 1부터 n 사이의 숫자를 리스트로 만든다. (list, range 함수)
  • 리스트의 각 요소를 돌면서 (반복문) 소수인지 확인한다.
  • 어떻게 소수인지 확인하지?
    • 소수는 1부터 자신까지의 수로 나누어 나머지가 0인 수가 2개만 존재한다. (range, 반복문)

다른사람 풀이


# 소수인지 판단
def is_prime(n):
    return all([(n%j) for j in range(2, int(n**0.5)+1)]) and n>1 # bool 값 리턴

# 소수의 갯수 리턴
def numberOfPrime(n):
    return [is_prime(x) for x in range(1, n+1)].count(True)  
  # return len(list(filter(is_prime, range(1, n+1))))

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(numberOfPrime(10))

배운점

  • all() 내장함수 : all(x)은 반복 가능한(iterable) 자료형 x를 입력 인수로 받으며, 이 x가 모두 참이면 True, 거짓이 하나라도 있으면 False를 리턴한다.
  • (※ 반복 가능한 자료형이란 for문으로 그 값을 출력할 수 있는 것을 의미한다. 리스트, 튜플, 문자열, 딕셔너리, 집합 등이 있다.)
  • .count(x) : 리스트, 문자열, 튜플 등 iterable 자료형 안의 x 요소의 갯수를 리턴한다.

level 2. 콜라츠 추측

|

출처

문제

1937년 Collatz란 사람에 의해 제기된 이 추측은, 입력된 수가 짝수라면 2로 나누고, 홀수라면 3을 곱하고 1을 더한 다음, 결과로 나온 수에 같은 작업을 1이 될 때까지 반복할 경우 모든 수가 1이 된다는 추측입니다. 예를 들어, 입력된 수가 6이라면 6→3→10→5→16→8→4→2→1 이 되어 총 8번 만에 1이 됩니다. collatz 함수를 만들어 입력된 수가 몇 번 만에 1이 되는지 반환해 주세요. 단, 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.

풀이 (python)

# 인자가 1보다 크면 계속 연산을 진행 > 1이 되는 순서를 리턴 > 순서가 500보다 크면 -1 리턴
def collatz(num):
    i = 0
    while num > 1:
        num = num * 3 + 1 if num % 2 else num / 2
        i += 1
    return i if i < 500 else -1

다른사람 풀이

# 500번 반복하여 연산을 진행 > 1이 되는 순서를 리턴 > 500번 반복해도 1이 되지 않으면 -1 리턴
def collatz(num):
    for i in range(500):
        num = num / 2 if num % 2 == 0 else num*3 + 1
        if num == 1:
            return i + 1
    return -1

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(collatz(6))

배운점

  • 3항 연산자를 잘 활용하자 A if 조건 else B

170317_TIL

|

오늘 한 일

  • 장고 개인프로젝트 의 FBV 일부를 CBV로 수정했다. 아직은 CBV, generic view에 대한 이해가 부족하다고 느꼈다.
  • 생활코딩 MySQL 수업을 들었다. mysql-monitor, phpmyadmin를 사용해서 데이터베이스를 능숙하게 다룰 수 있었으면 좋겠다.
  • 점프투 파이썬 함수, 입력과 출력 부분을 읽었다. 파이썬을 사용해서 파일을 읽어오고 수정하는 부분이 새로웠다.
  • 간단한 알고리즘 문제를 풀었다.

내일 할 일

170316_TIL

|

오늘 한 일

  • 오늘은 친구와 약속이 있어서 공부는 많이 하지 못했다.
  • 생활코딩 MySQL 수업을 듣고 블로그에 정리하기 시작했다.
  • django 가이드문서 form 부분을 읽었다.

내일 할 일