레이블이 Django인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Django인 게시물을 표시합니다. 모든 게시물 표시

2019년 1월 29일 화요일

[Django] 기본 설정


 OS  Ubuntu 16.04.4 LTS
 VERSION python 3.5.2

 Django 2.1.2


   요약

   소제목







   소제목

python manage.py makemigrations website 했는데

Traceback (most recent call last):
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/db/backends/mysql/base.py", line 15, in <module>
    import MySQLdb as Database
ImportError: No module named 'MySQLdb'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/core/management/__init__.py", line 357, in execute
    django.setup()
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/apps/registry.py", line 112, in populate
    app_config.import_models()
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/apps/config.py", line 198, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/lib/python3.5/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 665, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/contrib/auth/models.py", line 2, in <module>
    from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/contrib/auth/base_user.py", line 47, in <module>
    class AbstractBaseUser(models.Model):
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/db/models/base.py", line 101, in __new__
    new_class.add_to_class('_meta', Options(meta, app_label))
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/db/models/base.py", line 305, in add_to_class
    value.contribute_to_class(cls, name)
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/db/models/options.py", line 203, in contribute_to_class
    self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/db/__init__.py", line 33, in __getattr__
    return getattr(connections[DEFAULT_DB_ALIAS], item)
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/db/utils.py", line 202, in __getitem__
    backend = load_backend(db['ENGINE'])
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/db/utils.py", line 110, in load_backend
    return import_module('%s.base' % backend_name)
  File "/usr/lib/python3.5/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/db/backends/mysql/base.py", line 20, in <module>
    ) from err
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
에러남
https://stackoverflow.com/questions/2952187/getting-error-loading-mysqldb-module-no-module-named-mysqldb-have-tried-pre
해결 안됌
https://golch.github.io/django/2017/01/20/Django-MySQL-%EC%97%B0%EB%8F%99.html
이건거 같은데 안됨  에러남
Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/core/management/__init__.py", line 325, in execute
    settings.INSTALLED_APPS
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/conf/__init__.py", line 57, in __getattr__
    self._setup(name)
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/conf/__init__.py", line 44, in _setup
    self._wrapped = Settings(settings_module)
  File "/home/hs/VENV/myvenv/lib/python3.5/site-packages/django/conf/__init__.py", line 107, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/usr/lib/python3.5/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 665, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "/home/hs/VENV/website/website/settings.py", line 16, in <module>
    pymysql.insatll_as_MySQLdb()
AttributeError: module 'pymysql' has no attribute 'insatll_as_MySQLdb'



   소제목





   소제목






2019년 1월 23일 수요일

[Django] 부트스르랩


   요약

   소제목
부트스트랩


웹사이트를 쉽게 만들 수 있게 도와주는 HTML, CSS, JS 프레임워크이다. 하나의 CSS로 휴대폰, 태블릿, 데스크탑까지 다양한 기기에서 작동한다.
출처: 위키백과


2018년 11월 22일 목요일

[Django] error


 OS Ubuntu 16.04.4 LTS
 VERSION python 3.5.2

 Django 2.1.2


   요약
* manytomanyField를 filter 하면 기능 두개를 해결할 수 있을 것 같아서
* manytomanyField filter 공식 문서
* ForeignField('Test', on_delete=models.CASCADE)와 ForeignField(Test, on_delete=models.CASCADE)는 다르다. 'Test'를 썼을 때, posts doesn't provide model 'test'라고 했는데, Test로 바꾸자 ./manage makemigrations가 바로 성공했다.
* 'NoneType' object has no attribute '_meta' -> 에러 해결방법은 못찾았는데, 이 에러 일어난 원인이 tagging의 get_by_model 함수를 쓰려다 일어난 문제라서 예제를 찾아봤다.

2018년 11월 19일 월요일

[Django] error


 OS
 VERSION  
 COMPILER


   요약
https://wikidocs.net/6611#_1 참고중
배포를 어떻게 하지 하다가 일단 둘다 하지 뭐! 하는 중
* uWSGI 설치 중 오류가 생겼다. uwsgi" failed with error code 1 in /tmp/pip-install-7dw88li2/uwsgi/ 해결함
* .gitignore 적용이 안댐
* 정적파일 관리에 대해
* ***WARNING: you are running uWSGI without its master process manager *** ->포트를 8000으로 돌리려고 했는데, 로컬로 8000을 써고 있어서 그랬던 거임 일단 참고 주소는 여기
nginx: [emerg] no port in upstream "django"
--> 일단했는데 됐는지 잘 모르겠음

* uwsgi --http :8080 --home /home/hs/VENV/Website/vv --chdir /home/hs/VENV/Website/busan --module conf.wsgi 이 명령을 실행시키고 접속해보니까 internal Server error가 뜸 뭐지 에라이 아직 해결 안됌
* 호스팅 사이트들

* admin site 가 없다는 경고 메시지가 나옴->해결


[Django] 서버 배포


 OS
 VERSION  
 COMPILER


   요약


2018년 11월 18일 일요일

[Django] error


 OS
 VERSION  
 COMPILER


   요약
* __init__() got an unexpected keyword argument 'queryset'
* 'ModelFormOptions' object has no attribute 'private_fields'
* 검색 엔진, 진행중
* 환경변수 설정
* Could not find any executable java binary.Please install java in your PATH or set JAVA_HOME -> 컴퓨터 포맷하고 자바를 안깜.. ->자바 깔기->elasticsearch 연결
* UserWarning: updateis not implemented in this backend
* 안보이는 거 해결함 Image model에서 속성으로 post = ForeignField // image = ImageField 였음.
* 변경사항이 적용되지 않는 오류 발생함. 다른 로컬 서버 돌려보니까 괜찮음, 컴퓨터 문제는 아닌듯 하다 -> 링크 문제다. elasticSearch 를 적용하는 과정에서 jquery? json사용과 관련된 script를 link 했었는데 링크 지우니까 됌ㅎㅎ -> 아니네^^ 포스터 새로 작성한 것도 안들어감ㅋㅋㅋㅋ, 어쩔수없으면 프로젝트 한번 다시 생성해야 된다..ㅎㅎ


[Django] error


 OS
 VERSION  
 COMPILER


   요약
* [MediaDefiningClass] object is not iterable
* NOT NULL constraint failed:posts_post.user_id 라니까 아마.. forms에서 user 입력 칸이 없어서 user 값이 없이 저장돼서 그런듯->form에 추가하고 해결
* formSet 예제
* GET/
static/media/media/post_images/%EC%A7%B1%EC%A0%88%EB%AF%B8_38llAf9.jpeg HTTP/1.1" 404 1881 ->아... 폴더 지정 중에 잘못 들어간게 있어서 media가 두번 들어간 듯 한데.. 못찾겠다..-> 폴더 지정할 때, 여러 번 고쳤었는데 그때 생성한 게시물의 이미지의 경로가 잘못된 경로로 지정되었었다. 그래서 게시물의 이미지를 다시 수정해서 해결함
* object.filter을 쓰는데 오류가 남
* 로그아웃 상태에서 작성 접근 금지를 할 경우 오류가 일어날 수 있다고 한다. 일단 나는 안 일어나니까 메모만

2018년 11월 16일 금요일

[Django] eror


 OS
 VERSION  
 COMPILER


   요약
* formset_factory got multiple values for argument 'form'  -> Django 2.1 에서 formset_factory가 바뀐 것이라 생각된다. Image model을 지움
* __init__() got an unexpected keyword argument 'queryset', 여기서 queryset은 Image.objects.none() 인데, umm... 지워볼까->일단 지우고 해결
* name 'RequestContext' is not defined ->from django.template import RequestContext
* render() got an unexpected keyqord argument 'context_instance'
* render(), TemplateDoesNotExist -> template 변수를 posts/post_form.html
* object has no attribute 'cleaned_data'
* ['ManagementForm data is missing or has been tampered with']

2018년 11월 13일 화요일

[Django] error


 OS  Ubuntu 16.04.4 LTS
 VERSION python 3.5.2

 Django 2.1.2


   요약
* html 에서 이미지를 표시하는데, 이미지 이름만 나온다. html로 이미지 표시하는 방법을 찾아보니, <img src="path/to/image.png">라고 한다. 그래서 <img src="{{ post.image }}">로 했더니, 깨져서 나오는 현상이 나왔다. 음.. 그래서 생각해보니까 post.imgae에는 파일의 이름과 확장자만 표시되는게 아닐까? 싶어서 django html image로 다시 검색
 -> 아직 이미지가 깨진다. 왤까 다시 django html image 로 해결함, static dir 경로를 설정하고 안에 이미지 파일을 만들고 <img src={{ image.url }}/>로 해결함
* html tag 종류
* ValueError: invalid literal for int() with base 10 에러가 떴는데, 이 에러가 부분이 ForeignKey 부분의 class 참조 부분에서이다. 여기서 찾아보니까 장고 함수 내에서 문자로 값을 받아간 후 pk 값으로 변경한 후 입력하는데(이 때 pk 값이 10진수) 그 부분에서 오류가 난 것 같다. 근데 이게 원래 장고 표준인데 어쩌라는 건지 모르겠다 ㅎㅎ. -> 일단 나중에 옮기면서 고치는 걸로 하자 <- 이 부분이 1:N의 관계를 잘 생각하지 않아서 생긴 문제이다. N class 에서 models.ForeignKey를 해야 함(예를 들어, post와 user의 관계에서 class Post 안에 user = models.ForeignKey()해야 함).
* createView랑 form을 사용하고 싶은데, url에 생성해놔도 {% url %}로 안찾아진다!
 -> 여기  여기 참조해서 해보기
 

2018년 11월 6일 화요일

2018년 11월 5일 월요일

[Django] error


 OS  Ubuntu 16.04.4 LTS
 VERSION python 3.5.2

 Django 2.1.2

   요약

[Django] 클래스형 뷰

 OS  Ubuntu 16.04.4 LTS
 VERSION python 3.5.2

 Django 2.1.2

* 다음 내용은 한빛미디어 파이썬 웹프로그래밍 책을 재정리한 것입니다.

   요약
  • Django에서 클래스형 뷰를 사용하면 코드가 깔끔해지고 코드의 재사용성이나 개발 생산성을 높여준다.
  • 클래스형 뷰의 상속 기능을 이용하기 위해서는 제네릭 뷰에 대해 이해해야 한다.
  • 제네릭 뷰는 크게 Base View, Generic Edit View, Generic Display View, Generic Date View로 나눌 수 있다.

   클래스형 뷰

URLconf에서 클래스형 뷰 사용을 표시해야 한다.
 
# urls.py
from django.conf.urls import path
from myapp.views import MyView
 
urlpatterns = [
    path('about/', MyView.as_view()),
]

장고의 URL 해석기는 요청과 관련된 파라미터들을 클래스가 아닌 함수에 전달한다.
때문에, 클래스형 뷰는 클래스 진입을 위한 진입 메소드를 제공한다. 위의 예제에서의 as_view()와 같은 메서드이며, 아래의 순서로 요청을 처리한다.
  • as_view() 클래스의 인스턴스를 생성한다.
  • 생성된 인스턴스의 dispatch() 메소드를 호출한다.
  • dispatch() 메소드는 요청을 검사해서 어떤 HTTP 메소드(GET, POST)가 요청되었는지 알아낸다.
  • 인스턴스 내의 해당 이름을 갖는 메소드로 요청을 중계한다.
  • 해당 메소드가 정의되어 있지 않다면, HttpResponseNotAllowed 익셉션을 발생시킨다.
# views.py
from django.http import HttpResponse
from django.views.generic import View
 
class MyView(View):
    def get(self, request):
        # 뷰 로직 작성
        return HttpResponse('result') 
MyView 클래스는 View 클래스의 상속을 받는다.
View 클래스에는 as_view()와 dispatch()가 정의되어 있으므로 정의하지 않아도 사용할 수 있다.

클래스형 뷰의 장점

  • GET, POST 등의 HTTP 메소드에 따른 처리 기능을 코딩할 때, IF 함수를 사용하지 않고 메소드명으로 구분할 수 있으므로 코드의 구조가 깔끔해진다. 
  • 다중 상속과 같은 객체 지향 기술이 가능하므로, 클래스형 제네릭 뷰 및 믹스인 클래스 등을 사용할 수 있고, 이는 코드의 재사용성이나 개발 생산성을 높여준다.
효율적인 메소드 구분
클래스형 뷰가 HTTP 메소드(GET, POST, HEAD 등)의 요청을 수신한 후 어떻게 처리하고 함수형 뷰와 어떻게 다른지 비교해보자.  함수형 뷰는 아래와 같은 로직을 작성한다.

from django.http import HttpResponse
 
def my_view(request):
    if request.method == 'GET':
        # 뷰 로직 작성
        return HttpResponse('result') 

함수형 뷰에서는 요청 메소드의 속성을 체크하는 로직이 필요하기 때문에, 항상 if 조건의 체크문이 필요하다. 하지만 클래스형 뷰를 사용하면 다음과 같이 깔끔해진다.

# views.py
from django.http import Httpresponse
from django.views.generic import View
 
class MyView(View):
    def get(self, request):
        # 뷰 로직 작성
        return HttpResponse('result')

클래스형뷰에서는 HTTP 메소드 이름으로 클래스에 메소드를 정의하면 된다. 단, 메소드명은 소문자로 해야 한다.
이는, 클래스형 내부에 존재하는 dispatch() 메소드가 GET, POST 등의 어떤 HTTP 메소드로 요청되었는지를 알아낸 다음 해당 이름을 갖는 메소드로 요청을 중계해주기 때문에 가능한 것이다.

상속 기능 가능
우리가 작성하는 클래스형 뷰의 대부분은 제네릭 뷰를 상속받아 작성하므로, 상속 기능을 이해하려면 제네릭 뷰에 대해 알아야 한다.

# some_ app/urls.py
from django.urls import path
from some_app.views import AboutView
 
urlpatterns = [
    path('about/', AboutView.as_view()), 
] 

#some_app/views.py
from django.views.generic import TemplateView

class AboutView(TemplateView):
    template_name = "about.html"

제네릭 뷰란, 뷰 개발 과정에서 공통으로 사용할 수 있는 기능들을 추상화하여, 장고에서 미리 만들어 제공해주는 클래스형 뷰를 말한다. 제네릭 뷰를 상속받아 클래스형 뷰를 작성하는 예제를 살펴보자.

views.py 파일의 소스가 2줄로 로직을 완성할 수 있는 이유는 TemplateView 라는 제네릭 뷰를 사용하고 있기 때문이다.
TemplateView 는 뷰에 특별한 로직이 없고, URL 에 맞춰 해당 템플릿 파일의 내용만 보여줄 때 사용하는 제네릭 뷰이다. 따라서, 다음과 같이 URLconf 작성만으로 위와 같은 역할을 수행할 수도 있다.

# some_app/urls.py
from django.urls import path
from django.views.generic import TemplateView
 
urlpatterns = [
    path('about/', TemplateView.as_view(template_name="about.html")), 
] 

   클래스형 제네릭 뷰

Django에서 제공하는 제네렉 뷰는 다음과 같이 4가지로 분류할 수 있다.
  • Base View : 뷰 클래스를 생성하고, 다른 제네릭 뷰의 부모 클래스를 제공하는 기본 제네릭 뷰
  • Generic Display View : 객체의 리스트를 보여주거나, 특정 객체의 상세 정보를 보여줌
  • Generic Edit View : 폼을 통해 객체를 생성, 수정, 삭제하는 기능을 제공
  • Generic Date View : 날짜 기반 객체의 연/월/일 페이지로 구분해서 보여줌

Django의 제네릭 뷰 리스트(일부)
Base View
  • View : 가장 기본의 최상위 제네릭 뷰
  • TemplateView : 템플릿이 주어지면 해당 템플릿을 렌더링 해줌
  • RedirectView : URL이 주어지면 해당 URL로 리다이렉트 해줌
Generic Display View
  •  ListView : 조건에 맞는 여러 개의 객체를 보여줌
  • DetailView : 객체 하나에 대한 상세한 정보를 보여줌
Generic Edit View
  •  FormView : 폼이 주어지면 해당 폼을 보여줌
  • CreateView : 객체를 생성하는 폼을 보여줌
  • UpdateView : 기존 객체를 수정하는 폼을 보여줌
  • DeleteView : 기존 객체를 삭제하는 폼을 보여줌
Generic Date View
  •  ArchiveIndexView : 조건에 맞는 여러 개의 객체 및 그 객체들에 대한 날짜 정보를 보여줌
  • YearArchiveView : 연도가 주어지면 그 연도에 해당하는 객체들을 보여줌
  • MonthArchiveView : 연, 월이 주어지면 그에 해당하는 객체들을 보여줌
  • WeekArchiveView : 연도와 주차(week)가 주어지면 그에 해당하는 객체들을 보여줌
  • TodayArchiveView : 오늘 날짜에 해당하는 객체들을 보여줌
  • DateDetailView : 연, 월, 일 기본키(또는 슬러그)가 주어지면 그에 해당하는 특정 객체 하나에 대한 상세한 정보를 보여줌

   클래스형뷰에서 폼 처리

폼 처리 과정은 아래와 같이 3가지 경우로 구분할 수 있다.
  • 최초의 GET : 사용자에게 처음으로 폼(빈 폼 또는 초기 데이터로 채워진 폼)을 보여줌
  • 유효한 데이터를 가진 POST : 데이터를 처리함. 주로 리다이렉트 처리됨
  • 유효하지 않은 데이터를 가진 POST : 보통은 에러 메시지와 함께 폼이 다시 출력됨
아래는 함수형 뷰로 폼을 처리하는 코드이다.

from django.http import HttpResponseRedirect
from django.shortcuts import render

from .forms import MyForm
 
def myview(request):
    if request.method == "POST":
        form = MyForm(request.POST)
        if form.is_valid():
            # cleaned_date로 관련 로직 처리
            return HttpResponseRedirect('/success/')
    else:
        form = MyForm(initial={'key': 'value'})
 
    return render(request, 'form_template.html', {'form': form}) 

동일한 로직을 클래스형 뷰로 코딩해보자.

from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.views.generic import View

from .forms import MyForm

class MyFormView(View):
    form_class = MyForm
    initial = {'key': 'value'}
    template_name = 'form_template.html'

    def get(self, request, *args, **kwargs):
        form = self.form_class(initial=self.initial)
        return render(request, self.template_name, {'form': form})

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            # cleaned_data로 관련 로직 처리
            return render(request, self.template_name, {'form': form})

클래스형 뷰에서는 HTTP 의 GET 방식과 POST 방식을 클래스 내의 메소드로 구분하여 처리했기 때문에 구조가 깔끔해진다.
이 코드를 폼 처리용 제네릭 뷰인 FormView를 상속받아 처리하면 코드가 훨씬 간단해진다.

from .forms import MyFrom
from django.views.generic.edit import FormView
 
class MyFormView(FormView):
    form_class = MyForm
    template_name = 'form_template.html'
    success_url = '/thanks/'
 
    def form_valid(self, form):
        #cleaned_data로 관련 로직 처리
        return super(MyFormView, self).form_valid(form)
 
코딩의 내용이 훨씬 단순해졌는데, 다음의 4가지 사항을 유의해 코딩하면 된다.
  • form_class : 사용자에게 보여줄 폼을 정의한 forms.py 파일 내의 클래스명
  • template_name : 폼을 포함하여 렌더링할 템플릿 파일 이름
  • success_url : MyFormView 처리가 정상적으로 완료되었을 때 리다이렉트 시킬 URL
  • form_valid() 함수 : 유효한 폼 데이터로 처리할 로직 코딩, super() 함수를 사용하면, success_url 로 지정된 URL로 리다이렉션 처리됨

[Django] error


 OS  Ubuntu 16.04.4 LTS
 VERSION python 3.5.2

 Django 2.1.2

   요약


2018년 10월 30일 화요일

[Django] 설치


 OS  Ubuntu 16.04.4 LTS
 VERSION python 3.5.2

 Django 2.1.2

   요약
https://tutorial.djangogirls.org/ko/
1. python, pip 설치 및 업그레이드
2. 가상환경 설치하기
3. 가상환경 생성, 접속하기
4. python과 pip 버전 업그레이드 하기
5. Django 설치 및 업그레이드 하기

   Django 프로젝트 시작을 위한 설치방법
프로젝트를 갈아엎을때마다 찾는게 번거로워서 정리한다.
아래 설치 방법은 간단히 명령어만 나열한 것으로 다소 이해가 어려울 수 있으므로, 처음 장고를 접하는 분들은 위의 장고걸스 튜토리얼을 참조하는 것이 좋다.

1. python, pip 설치 및 업그레이드
파이썬 버전 확인
~$ python -V
파이썬3 버전 확인 
~$ python3 -V
 
pip 설치 및 업그레이드
~$ sudo apt install python-pip
~$ sudo pip install --upgrade pip

2. 가상환경 설치하기
가상환경을 설치할 디렉토리 생성
~$ mkdir VENV
~$ cd VENV
 
가상환경 설치
~$ sudo apt-get install python3-venv

3. 가상환경 생성, 접속하기
가상환경 생성
~$ python3 -m venv 가상환경이름
 
가상환경 접속
~$ source 가상환경이름/bin/activate
 
가상환경 종료
~$ deactivate  

4. python과 pip 버전 업그레이드 하기
~$ python3 -V
~$ python3 -m pip insatll --upgrade pip 

5. Django 설치 및 업그레이드 하기
장고 설치
~$ pip install Django
장고 업그레이드
~$ pip install Django --upgrade

장고 버전 확인하기
~$ python -m django --version

2018년 10월 17일 수요일

[파이썬 웹 프로그래밍] 웹 프로그래밍의 이해

   요약


   웹 프로그래밍이란?
웹 프로그램이란 기본적으로 클라이언트-서버로 이루어진다. 웹 클라이언트와 웹 서버는 통신 규약인 HTTP 프로토콜을 기준으로 정보를 주고 받는데, 웹 클라이언트는 요청하고 웹 서버는 응답하는 방식이다.

보통은 웹 브라우저가 웹 클라이언트로 사용되고, 우리는 주로 웹 프레임워크를 활용하여 웹 서버를 개발한다.

웹 클라이언트의 역할은 웹 서버로 요청을 보내는 것이기 때문에 웹 브라우저 외에도 다양하게 만들 수 있다.

웹 브라우저
웹 브라우저는 사용자가 주소창에 접속하고자 하는 웹 서버의 URL을 입력하면, 입력된 문장을 해석하여 웹 서버에게 HTTP 요청을 보낸다. 그럼 요청을 받은 웹 서버는 그 결과를 웹 브라우저로 전송하고, 웹 브라우저는 전송받은 결과를 사용자가 볼 수 있도록 HTML 텍스트를 해석하여 화면에 보여준다.

리눅스 curl 명령을 사용한 요청
curl 명령은 command line 용 data transfer tool 로써, download/update가 모두 가능하다. HTTP/HTTPS/FTP/LDAP/SCP/TELNET/SMT 등 여러 가지의 주요한 프로토콜을 지원하며 주요한 OS에서 구동되므로 여러 플랫폼와 OS에서 유용하게 사용할 수 있는 명령이다. 인자로 넘어온 URL로 HTTP 요청을 보낸다.

Telnet을 사용한 요청
텔넷은 자신이 사용권한을 가지고 있다는 전제하에 다른 사람의 호스트 컴퓨터를 원격지에서 액세스할 수 있도록 해주는 방법이다. 원격지 컴퓨터를 액세스하기 위한 사용자 명령들과 TCP/IP 기반의 프로토콜을 말한다. telnet 명령은 터미널 창에서 입력하는 내용을 그대로 웹 서버에 전송하기 때문에 URL을 통해 HTTP 요청을 보낼 수 있다.

물론 다양한 방법이 있지만, 어떤 방법을 사용하는지와 상관없이 웹 서버는 동일한 요청을 받을 경우 동일한 응답을 준다.


   HTTP 프로토콜
HTTP(Hypertext Transfer Protocol)은 웹 서버와 웹 클라이언트 사이에서 데이터를 주고받기 위해 사용하는 통신 방식으로, TCP/IP 프로토콜 위에서 동작한다. 즉, 웹을 이용하려면 웹 서버와 웹 클라이언트는 각각 TCP/IP 동작에 필수적인 IP 주소를 가져야 한다는 의미이다.


클라이언트인 웹 브라우저의 주소창에 URL을 입력하고 전송하면 다음과 같이 동작한다.


이 때, 요청과 응답은 HTTP 규정에 맞춘 메시지로 전달된다.


                                 

* 빈 줄은 헤더와 바디를 구분하는 구분자이다.

요청메시지
--------------------------------------------------------------------------------------------
GET /book/shakespeare HTTP/1.1  요청라인 [요청방식 요청URL 프로토콜 버전]
Host: www.example.com:8080      헤더 [이름: 값]
                                                    여러 줄도 가능하다.
--------------------------------------------------------------------------------------------

Host 항목은 필수로 표시해줘야 하는데, Host 헤더로 표현할 수도 있고, 요청라인의 URL에 Host를 표시하면 Host 헤더는 생략할 수 있다.

--------------------------------------------------------------------------------------------
GET http://www.example.com:8080/book/shakespeare HTTP/1.1
--------------------------------------------------------------------------------------------

응답메시지
--------------------------------------------------------------------------------------------
HTTP/1.1 200 OK                        상태라인 [프로토콜 버전 상태 코드 상태 텍스트]
Content-Type: application/xhtml+xml; charset=utf-8  헤더
                                               빈 줄 헤더와 바디를 구분한다.
<html>                                     바디
...
</html>
--------------------------------------------------------------------------------------------

**수정


많은 메소드가 있지만, 가장 많이 사용하는 메소드는 HTML의 폼을 지정할 수 있는 GET과 POST이다. 두 메소드는 사용자가 입력한 데이터를 받아 서버로 전달하여 폼을 지정하는데, 입력 데이터를 전달하는 방법이 각기 다르다. 예시를 살펴보자.

GET
? 뒤에 이름=값 쌍으로 서버에게 보낸다.
GET http://docs.djangoproject.com/search/?q=forms&release=1 HTTP/1.1

POST
요청 메시지의 바디에 넣어 서버에게 보낸다.
POST http://docs.djangoproject.com/search/HTTP/1.1
Content-Type: application/x-www-form-urlencoded

q=forms&release=1

이러한 방식의 차이로 인해 GET 방식을 이용하면 많은 데이터를 보내기가 어렵다. 또한 전달되는 사용자의 데이터가 주소창에 노출되므로 보안 측면에서도 불리하다.
따라서 폼을 사용하거나 추가적인 파라미터를 서버로 보내는 경우에는 POST 방식을 사용하는 것이 좋다.

클라이언트가 서버에 요청한 것의 처리 결과는 응답 메시지의 상태라인에 있는 상태 코드를 보고 파악할 수 있다. 상태 코드는 세 자리 숫자로 되어 있고, 첫 번째 숫자는 HTTP 응답의 종류를 나타내고 나머지 두 숫자는 세부적인 으답 내용의 구분을 위한 번호이다.





   URL 설계





   웹 애플리케이션 서버