Exception Type: DisallowedHost at / Exception Value: Invalid HTTP_HOST header: 'django-env.vsvztq2hxp.us-west-1.elasticbeanstalk.com'. You may need to add 'django-env.vsvztq2hxp.us-west-1.elasticbeanstalk.com' to ALLOWED_HOSTS.
Just add django-env.vsvztq2hxp.us-west-1.elasticbeanstalk.com to your ALLOWED_HOSTS in settings.py
함수형 뷰에서는 예제에서 볼 수 있듯 HTTP 메소드별 다른 처리가 필요할 때 if 문을 이용해야 한다. 하지만, 클래스형 뷰는 다음과 같이 코드의 구조가 훨씬 깔끔해짐을 볼 수 있다.
from django.http import HttpResponse
from django.views.generic import View
classMyView(View):defget(self, request):# 뷰 로직 작성return HttpResponse('result')
클래스형 뷰에서는 HTTP 메소드 이름으로 클래스 내의 메소드를 정의하면 된다. 단, 메소드명은 소문자로~ 이러한 처리가 가능한 것은 내부적으로 dispatch() 메소드가 어떤 HTTP 메소드로 요청되었는지 알아내고, 이를 처리해주기 때문이다.
아래의 예는 HTTP의 HEAD 메소드로 코딩하는 예를 보여준다.
from django.http import HttpResponse
from django.views.generic import ListView
from books.models import Book
classBookListView(ListView):
model = Book
defhead(self, *args, **kwargs):
last_book = self.get_queryset().latest('publication_date')
response = HttpResponse('')
response['Last-Modified'] = last_book.publication_date.strftime('%a, %d %b %y %H:%M:%S GMT')
return response
위 예제는 서점에 방문한 직후에 새롭게 출간된 책이 있는지를 문의하는 로직이다. 최근 발간된 책이 없는데도 책 리스트를 서버로부터 받아 오게되면 네트워크 대역폭이 낭비되므로, 이를 방지하기 위해 HEAD 메소드를 사용한다. HEAD 요청에 대한 응답은 바디 없이 헤더만 보내주면 된다.
"""tutorial URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, re_path
from community.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('write/', write, name='write'),
path('list/', list, name='list'),
]
path('list/', list, name='list') : get list/에 응답하기 위해 새롭게 추가합니다.
첫번째 파라미터로 url주소를
두번재 파라미터로 받은 요청을 어디로 전달할지
세번재로는 내부적으로 사용되는 path명을 기입한다.
위 코드는 클라이언트로부터 받은 요청을 컨트롤러(views.py)의 list함수로 전달합니다.
3. send request
views.py
from django.shortcuts import render
from community.forms import *
# from django.views.decorators.csrf import csrf_exempt
# Create your views here.
# 사용자에게 들어온 요청을 받고, response를 반환함
def write(request):
form = Form()
return render(request, 'write.html', {'form':form})
# @csrf_exempt
def save(request):
if (request.method == 'POST'):
form = Form(request.POST)
if form.is_valid():
form.save()
return render(request, 'save_complete.html')
else:
return render(request, 'save_not_complete.html')
def list(request):
lArticles = Article.objects.all()
context = {'lArticles': lArticles}
return render(request, 'list.html', context)
def list(request) : /list/에서 오는 request를 처리하기 위해 새롭게 추가된 함수입니다.
4. get DB table object, 5. return DB table object, 6. get all data from DB table
lArticles = Article.objects.all() : 이전 포스트에서 언급한 바와같이 models.py의 class로 존재하는 class Article에는 모든 모듈에서 클래스명만으로 접근을 할 수 있습니다.
lArticles = Article.objects.all()의 문법으로 Article테이블(정확하게는 community_article테이블)의 결과값을 리스트 형태로 받아올 수 있습니다.
select * from community_article과 완전히 동일한 결과라고 보시면 됩니다.
7. parsing list to html, 8. return parsed html, 9. rendering html as response
views.py
from django.shortcuts import render
from community.forms import *
# from django.views.decorators.csrf import csrf_exempt
# Create your views here.
# 사용자에게 들어온 요청을 받고, response를 반환함
def write(request):
form = Form()
return render(request, 'write.html', {'form':form})
# @csrf_exempt
def save(request):
if (request.method == 'POST'):
form = Form(request.POST)
if form.is_valid():
form.save()
return render(request, 'save_complete.html')
else:
return render(request, 'save_not_complete.html')
def list(request):
lArticles = Article.objects.all()
context = {'lArticles': lArticles}
return render(request, 'list.html', context)
href="/view/{{ article.id }}" : 이때 리스트에서 각 id를 클릭하면, 게시글로 이동할 수 있도록, /view/[idNum]의 url을 동적으로 만들어줍니다.
get /view 개발
get /view작성을 위한 시퀀스도
1. get: /view/, 2. dispatch url
urls.py
"""tutorial URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, re_path
from community.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('write/', write, name='write'),
path('list/', list, name='list'),
re_path(r'^view/(?P<num>[0-9]+)/$', view, name='list'),
]
re_path(r'^view/(?P<num>[0-9]+)/$', view, name='list') : view/이후에 숫자가 들어온 부분을 파라미터로 인정하여, controller에게 전달합니다. 가령 view/15가 urls.py로 들어왔다면, num = 15 라는 파라미터로 넣어 controller인 views.py의 view함수로 넘겨줍니다.
첫번째 파라미터로 url주소를
두번재 파라미터로 받은 요청을 어디로 전달할지
세번재로는 내부적으로 사용되는 path명을 기입한다.
위 코드는 클라이언트로부터 받은 요청을 컨트롤러(views.py)의 list함수로 전달합니다.
3. send request
views.py
from django.shortcuts import render
from community.forms import *
# from django.views.decorators.csrf import csrf_exempt
# Create your views here.
# 사용자에게 들어온 요청을 받고, response를 반환함
def write(request):
form = Form()
return render(request, 'write.html', {'form':form})
# @csrf_exempt
def save(request):
if (request.method == 'POST'):
form = Form(request.POST)
if form.is_valid():
form.save()
return render(request, 'save_complete.html')
else:
return render(request, 'save_not_complete.html')
def list(request):
lArticles = Article.objects.all()
context = {'lArticles': lArticles}
return render(request, 'list.html', context)
def view(request, num):
article = Article.objects.get(id=num)
context = {'article': article}
return render(request, 'view.html', context)
def view(request, num) : urls.py에서 로 념겨준 부분을 controller의 함수에서 파라미터를 통해서 받습니다. 이 부분 중요합니다.
4. get DB table object, 5. return DB table object, 6. get all data from DB table
article = Article.objects.get(id=num) : 이번에는 Article테이블(정확하게는 community_article테이블)의 모든 row를 가져오는게 아니고, 조건을 걸어줬네요. select * from community_articl where id=num와 동일한 결과를 가져온다고 생각하시면 됩니다.
select * from community_article과 완전히 동일한 결과라고 보시면 됩니다.
7. parsing list to html, 8. return parsed html, 9. rendering html as response
views.py
from django.shortcuts import render
from community.forms import *
# from django.views.decorators.csrf import csrf_exempt
# Create your views here.
# 사용자에게 들어온 요청을 받고, response를 반환함
def write(request):
form = Form()
return render(request, 'write.html', {'form':form})
# @csrf_exempt
def save(request):
if (request.method == 'POST'):
form = Form(request.POST)
if form.is_valid():
form.save()
return render(request, 'save_complete.html')
else:
return render(request, 'save_not_complete.html')
def list(request):
lArticles = Article.objects.all()
context = {'lArticles': lArticles}
return render(request, 'list.html', context)
def view(request, num):
article = Article.objects.get(id=num)
context = {'article': article}
return render(request, 'view.html', context)
"""tutorial URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, re_path
from community.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('write/', write, name='write'),
]
클라이언트로부터 write/로 요청이 들어오면 가장 먼저, urls.py를 보고 url을 dispatch합니다. 위 코드에서 path('write/', write, name='write') 의 부분으로
첫번째 파라미터로 url주소를
두번재 파라미터로 받은 요청을 어디로 전달할지
세번재로는 내부적으로 사용되는 path명 을 기입한다.
위 코드는 클라이언트로부터 받은 요청을 컨트롤러(views.py)의 write함수로 전달합니다.
3. send request
views.py
from django.shortcuts import render
from community.forms import *
# from django.views.decorators.csrf import csrf_exempt
# Create your views here.
# 사용자에게 들어온 요청을 받고, response를 반환함
def write(request):
form = Form()
return render(request, 'write.html', {'form':form})
path('write/', write, name='write') 에 따라 urls.py에서 dispatch한 request가 도착하는 곳이 바로 write게 되겠네요.
4. create form, 5. call models to create form, 6.return form, 7. return form
views.py
from django.shortcuts import render
from community.forms import *
# from django.views.decorators.csrf import csrf_exempt
# Create your views here.
# 사용자에게 들어온 요청을 받고, response를 반환함
def write(request):
form = Form()
return render(request, 'write.html', {'form':form})
forms.py
from django.forms import ModelForm
from community.models import *
class Form(ModelForm):
class Meta:
model = Article
fields = ['name', 'title', 'contents', 'url', 'email']
models.py
from django.db import models
# Create your models here.
class Article(models.Model):
# Override Fields
# 이게 데이터베이스에서 테이블의 컬럼을 만드는 것임
name = models.CharField(max_length=50)
title = models.CharField(max_length=50)
contents = models.TextField()
url = models.URLField()
email = models.EmailField()
cDate = models.DateTimeField(auto_now_add=True)
write함수 내의 form = Form() 을 보도록 합시다.
forms.py의 Form 클래스가 하는 일은, ModelForm을 상속받아 딱히 리턴이 없어도 생성한 db에 맞는 input form을 생성해 주는 모양입니다.. 디버깅을 해본 결과 form = Form()은 form object입니다. 다해주네요 장고는..
forms.py의 Form 클래스에서 주목할 부분이, model = Article 인데요. Article은 models.py에서 생성한 적이 있는, 테이블 정보에 관한 클래스입니다. 모든 모듈에서 models내부에 있는 클래스명들은 딱히 import하지 않아도 불리는 모양이더라구요.
너무 다해주네요.
다음으로 넘어가기 전에 templates폴더를 생성하고 그 아래 view가 될 html들을 생성해 줍시다
자동으로 생성된 디렉토리 트리에서 templates라는 디렉토리를 앱명으로 만들어진 디렉토리 직하에 생성한 후
그 아래 view를 구성하게될 html파일들을 넣어줍니다.
templates디렉토리 안에 write.html을 생성해주세요.
8. parsing form to html, 9. return parsed html, 10. render html as response
자그럼 이제 생성된 form을 html에 어떻게 넣냐.
views.py
from django.shortcuts import render
from community.forms import *
# from django.views.decorators.csrf import csrf_exempt
# Create your views here.
# 사용자에게 들어온 요청을 받고, response를 반환함
def write(request):
form = Form()
return render(request, 'write.html', {'form':form})
"""tutorial URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, re_path
from community.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('write/', write, name='write'),
path('save/', save, name='save'),
]
path('save/', save, name='save'): urlpatterns리스트에추가합니다. path안의 각 파라미터 갖는 의미는 write때와 동일합니다.
첫번째 파라미터로 url주소를
두번재 파라미터로 받은 요청을 어디로 전달할지
세번재로는 내부적으로 사용되는 path명 을 기입한다.
위 코드는 클라이언트로부터 받은 요청을 컨트롤러(views.py)의 save함수로 전달합니다.
3. send request
views.py
from django.shortcuts import render
from community.forms import *
# from django.views.decorators.csrf import csrf_exempt
# Create your views here.
# 사용자에게 들어온 요청을 받고, response를 반환함
def write(request):
form = Form()
return render(request, 'write.html', {'form':form})
# @csrf_exempt
def save(request):
if (request.method == 'POST'):
form = Form(request.POST)
if form.is_valid():
form.save()
return render(request, 'save_complete.html')
else:
return render(request, 'save_not_complete.html')
def save(request) : /save/에서 오는 request를 처리하기 위해 새롭게 추가된 함수입니다.
django는 시큐리티쪽도 알아서 해줍니다. post송신을 할때, csrf토큰을 html로부터 받아 안전하게 post처리를 하게 하는데요. 안전하게 라는 단어의 의미가 애매하므로 csrf토큰이 무슨일을 하는지 다음의 블로그에서 확인해주세요.
{% csrf_token %} 이 라인을 통해 csrf토큰을 발행해 save로 포트스할 수 있었던 겁니다!
만약 html쪽에서 csrf토큰을 발행하지 않으면, 렌더링 오류 페이지가 발생하는데요. csrf토큰이 없어서 페이지를 렌더링 못하겠다는 오류가 발생합니다. 이때의 해결방법은 다음과 같습니다.
controller의 해당 함수에 @csrf_exempt 어노테이션을 추가하여 csrf토큰이 없어도 렌더링 할 수 있도록한다.(현재 소스코드에서 코멘트아웃되어 있는부분)
4. create form data, 5. return form data
views.py
from django.shortcuts import render
from community.forms import *
# from django.views.decorators.csrf import csrf_exempt
# Create your views here.
# 사용자에게 들어온 요청을 받고, response를 반환함
def write(request):
form = Form()
return render(request, 'write.html', {'form':form})
# @csrf_exempt
def save(request):
if (request.method == 'POST'):
form = Form(request.POST)
if form.is_valid():
form.save()
return render(request, 'save_complete.html')
else:
return render(request, 'save_not_complete.html')
forms.py
from django.forms import ModelForm
from community.models import *
class Form(ModelForm):
class Meta:
model = Article
fields = ['name', 'title', 'contents', 'url', 'email']
form = Form(request.POST) : request로 받아온 post정보를 Form의 인자로 넘기면 form오브젝트를 반환합니다. form오브젝트는 ModelForm은 상속하고 있으므로 그 아래있는 다양함 함수에 접근할 수 있는 인스턴스입니다.
6. check form data validation
form.is_valid() : 인스턴스가 접근할 수 있는 편리한 함수중 하나가 is_valid()함수입니다. post로 가져온 request 정보가 Article DB에 insert되게 적합한 정보를 모두 가지고 있는지 아닌지 validation을 수행합니다..
7. insert to DB
form.save() : 장고에선 sql을 전혀 사용할 필요가 없다는 걸 깨닳았습니다. 이 라인하나로 post로 가져온 request 정보를 Article DB에 inser해주게 됩니다.
편리하게 생성해주긴 하는데, nodejs나 java를 통해 웹개발은 해온 개발자라면, 직접 db를 보지 않고서는 영 찜찜하다.. python manage.py migrate커맨드를 실행했다면, root디렉토리에 db.sqlite3라는 파일이 생성되는데, 이 파일이 있는 루트디렉토리로 이동을 하자.
Has anyone had issues setting up a debug configuration for Django project in PyCharm Community Edition? Community Edition of the IDE is lacking the project type option on project setup and then when I am setting up Debug or Run config it asks me for a script it should run. What script would it be for Django, manage.py? Thanks in advance
I notice that server breakpoints are masked when client breakpoints are present. Try removing all client breakpoints to see your server breakpoints get hit. – Steve ElmerApr 12 '17 at 14:56
Judicious use of sleep() in the client code prevents the browser from breaking the connection while you're in the debugger on the server. – Steve ElmerApr 12 '17 at 15:08
Great thanks @Zlatko Rončević, I worked out the answer shortly after I posted the question but never updated it here - yours is exactly what worked for me. I am sorry I won't be able to vote it up as I have too small reputation :( But I would if I had it. Other people viewing this question please do so. – emkorybskiFeb 23 '15 at 22:15
1
If you have environment variables, you should run PyCharm with the constants set from command line. – anizzomcApr 24 '15 at 13:51
@ZlatkoRončevi same thing I followed debugger is starting but when I open browser and debugger is not bringing cursor to the break points – niranApr 26 '16 at 3:22