3월, 2015의 게시물 표시

Metaclasses in Python

이미지

Python 3 Metaprogramming

이미지

[uscript] 8장. file upload/download 구현

다운로드와 업로드 구현은 request, response 객체에 정보를 읽거나 넣어주면 구현이 가능하다. 다운로드 구현은 아래와 같이 스크립트의 객체를 얻어와 본문에 있는 내용을 한글로 인코딩하여 첨부 파일 형태로 다운로드 되게 하였다. 제목은 파일의 이름으로 하고 내용은 response header에 content-disposition에 attachment 형태로 파일헤더를 추가하고 내용을 response.write로 출력을 하면 된다. 크롬에서는 다운로드 폴더로 내려오고 IE 에서는 파일창으로 열기 또는 저장 메세지 창이 뜬다. def scripts_download(request, scripts_id): scripts = get_object_or_404(Scripts, id=scripts_id) title = scripts.title.encode('euc-kr') response = HttpResponse(content_type='plain/text') response['Content-Disposition'] = 'attachment; filename=' + title response.write(scripts.contents.encode('euc-kr')) return response 업로드 구현은 찾는데 조금 고생을 하였는데 post 형식으로 파일을 전달시 장고에서 csrf에 대한 보호모드를 적용해야 되서 아래와 같이 @csrf_exempt 와 @csrf_protect 데코레이터 함수로 구현을 한다. 로그인 사용자만 업로드할 수 있게 login_required 함수도 같이 적용하였다. 업로드는 UploadFileForm이라는 Form 클래스로 화면을 구현하고 화면의 form이 유효한 화면이면 업로드를 하고 그렇지 않으면 다시 업로드 화면으로 돌아간다. 업로드 폼은 간단하고 Form을 상속받아 파일 필드를 가지는 폼으로

[uscript] 7장. script detail 만들기

스크립트 id 값으로 조회하는 상세화면을 만들어보자. update와 동일하고 수정할수 있느냐 없느냐의 차이만 있다. url을 아래와 같이 추가하자. url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'), detail.html 을 다음과 같이 만든다. <div class="total-page"> <h4>{{ scripts.title }}</h4> {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %} {% csrf_token %} <div class="code-page"><pre><code>{{ scripts.contents }}</code></pre></div> <p><label name="tag-list">Tag:</label> {{ taglist }} </p> <a class="btn btn-default" href="update/"> <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Edit</a> <a class="btn btn-default" href='/scripts/{{ scripts.id }}/download' > <span class="glyphicon glyphicon-download" aria-hidden

[uscript] 6장. script update 만들기

이번에는 스크립트 업데이트 화면을 만들어본다. 스크립트를 작성하였다면 script id 값으로 데이터가 생성되었으므로 생성(add)과 다르게 id 값으로 수정화면으로 접근한다. urls.py 에서 update 화면과 update submit 을 처리하는 view를 만든다. url(r'^(?P<pk>\d+)/update/$', views.ScriptsUpdateView.as_view(), name='update'), url(r'^(?P<scripts_id>\d+)/update/submit/$', views.scripts_update, name='update_submit'), url에서 보면 update id 값으로 화면을 조회하고 submit을 할 수 있게 구성하였다. 수정화면은 작성화면과 동일하게 구성한다. update.html 을 다음과 같이 작성한다. add.html과 다른 점은 action에 url에 파라미터로 scripts.id가 들어간다. <form action="{% url 'scripts:update_submit' scripts.id %}" method="post" class="form-inline"> {% csrf_token %} <table class="table"> <tr> <td>Title</td> <td><input class="form-control" type="text" name="title" value="{{ scripts.title }}" /></td> </tr> <tr> <td>Contents</td>

beautiful soup를 이용한 크롤링

youtube 사이트 정보를 읽어서 간단한 유튜브 동영상 뷰 사이트를 만들어 보려고 한다. 소스는 github   https://github.com/shsong97/kids-tv.git  에 있다. beautiful soup를 이용한 크롤링을 해보자. BeautifuleSoup 사이트에 가면 사용방법이 자세히 나와있다. http://www.crummy.com/software/BeautifulSoup/ 우선 다운로드를 하려면 커맨드 창에서 아래와 같이 입력한다. pip install beautifulsoup4 내가 작성한 youtube 크롤링 방법은 아래의 소스를 받으면 된다. https://gist.github.com/shsong97/f15d7e03135f018cacac # -*- coding: utf-8 -*- from bs4 import BeautifulSoup import urllib query = u'소피아'.encode('utf-8') url = 'https://www.youtube.com/results?search_query=' + query html_doc = urllib.urlopen(url) soup = BeautifulSoup(html_doc) links = soup.findAll('div', attrs={'class':'yt-lockup-dismissable'}) for link in links: #img = link.find('img')['src'] img = link.find('div',attrs={'class':'video-thumb'}).find('img') try: if img['data-thumb'] != '': pri

[uscript] 5장. script add 만들기

템플릿을 만들어보자. url에서 정의한 add_submit의 이름으로 호출한다. url(r'^add/submit/$', views.scripts_add, name='add_submit'), {% url 'scripts:add_submit' %} 또는 add/submit으로 호출할수도 있다. views.py 에서 아래 함수를 만든다. django에서는 모델 정보를 매핑해서 form을 쉽게 만들수 있게 제공하고 있다. CreateView를 import 하고 상속을 받아서 사용한다. model에 우리가 작성한 모델을 매핑하고 보여줄 화면 템플릿을 지정한다. from django.views.generic.edit import CreateView class ScriptsCreate(CreateView):     model = Scripts     template_name = 'scripts/add.html' add.html 파일에서 단순하게 form.as_p() 를 호출하면 알아서 화면을 보여주는데 화면이 별로 예쁘게 보이지 않는다면 직접 화면을 구성할 수 있다. django에서 모델을 이용한 View를 만드는 샘플이다. # views.py from django.views.generic.edit import CreateView , UpdateView , DeleteView from django.core.urlresolvers import reverse_lazy from myapp.models import Author class AuthorCreate ( CreateView ): model = Author fields = [ 'name' ] class AuthorUpdate ( UpdateView ): model = Author fields = [ 'name' ]

[uscript] 4장. url을 만들자

django project를 생성하면 urls.py 파일이 만들어지는데 아래와 같이 django.conf.urls의 petterns, url을  import 한다. 그리고 url에 해당하는 실제 구현부분은 views.py 에 구현이 된다. 그래서 views 파일을 import 해야한다. urlpatterns 라는 url 관리 객체에 주소를 담는데 정규식을 이용하여 주소를 검색할 수 있게 지원이 된다. petterns의 첫부분은 '' 로 들어가는데 prefiex 부분으로 url의 시작부분을 지정할 수 있다. 공백이 아니라 'script' 라고 되어 있다면 그 아래에 나오는 add라는 주소는 다음과 같이 호출을 해야 한다 scripts/add 보통 프로젝트에서 ''로 시작하고 하위 app 에서는 urls.py를 include 로 붙이는데 주소의 경로가 "프로젝트/앱/url" 정의로 구성할 수 있다. url에 name으로 지정한 이름은 html 파일에서 주소를 찾을 때 이름값을 쓰면 url의 주소를 매칭해서 변환해준다.  html 파일에서 url을 지정할때 /scripts/add 라고 넣을수도 있지만 {% url 'scripts_add' %} 로 입력해도 주소를 변환해서 링크로 만들어준다. from django.conf.urls import patterns, url from scripts import views urlpatterns = patterns('',     url(r'^$', views.search_page, name='index'),     url(r'^add/$', views.ScriptsCreate.as_view(), name='scripts_add'),     url(r'^add/submit/$', views.scripts_add, name='add_s

[uscript] 3장. Model을 만들자

모델을 만들어 보자. MVC 에서 보통 Model View Controller 라고 얘기하는데 django 에서는 Model View Template 이라고 많이 쓴다. MVC에서 Control에 해당되는게 django에서는 View 이다. 그리고 View(화면)으로 얘기하는 부분이 템플릿에 해당한다. 모델은 데이터를 담아두는 공간으로 데이터베이스에서는 테이블에 해당된다. django 에서는 모델을 클래스로 정의하여 database api를 통해 모델과 연동이 된다. 즉, 따로 데이터베이스 설계를 하지 않고 모델을 정의해서 데이터베이스에 대한 상세한 내용을 알지 못해도 구현이 가능하다. 모델은 django.db의 models로 구현이 된다. 아래를 import 하자 from django.db import models import datetime from django.utils import timezone from django.contrib.auth.models import User django의 모델을 사용하기 위해서 models와 사용자 객체를 이용하기 위한 User를 import 해야 한다. 스크립트 관리자의 모델은 아래와 같이 정의한다. class Scripts(models.Model):     title = models.CharField('Title',max_length=200)     contents = models.TextField()     pub_date = models.DateTimeField('PubDate',default=timezone.now())     user=models.ForeignKey(User) models 에 있는 Model 부모객체를 상속받아 Scripts라고 이름을 정하였다. 앞에서 설정한 syncdb 명령을 내리면 scripts 테이블이 생성된다. $ manage.py sql scripts 명령을 내리면 테이블이 생성되는 스크립트를 볼 수

[uscript] 2장. 프로젝트 및 앱 생성

이미지
django가 설치되었다고 가정하고 진행한다. 만약 설치되어 있지 않으면 다음과 같이 설치한다. $ pip install django 우선 프로젝트를 생성해야 한다. 프로젝트는 커맨드 창에서 다음과 같이 입력한다. $ django-admin.py startproject uscript 프로젝트를 생성후 스크립트를 관리하는 앱을 생성한다. $ cd uscript $ manage.py startapp scripts 생성이 제대로 되었다면 runserver 명령으로 테스트서버를 띄워본다. $ manage.py runserver 위 2줄 명령으로 간단히 테스트 서버를 만들어보았다. 제대로 구동이 된다면 아래와 같이 localhost를 띄워 볼 수 있다. D:\uscript>manage.py runserver Validating models... 0 errors found March 10, 2015 - 21:52:07 Django version 1.6, using settings 'uscript.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK. 테스트 웹 화면을 띄웠지만 아직은 아무것도 준비된게 없다. Ctrl-C 를 눌러 웹서버를 중단하고 다음과 같이 입력한다. $ manage.py syncdb syncdb를 입력하면 데이터베이스가 만들어진다. django에서 기본적으로 sqlite3으로 지정되어 있어 별도의 데이터베이스 연결없이 바로 만들어 볼 수 있다. syncdb 명령을 내리면 사용자, 그룹 관련 테이블이 자동으로 만들어지고 super user 아이디를 등록할 수 있다. 관리자 모드로 들어가기 위해서 필요한 아이디이기 때문에 만들어야 한다. 다시 개발서버를 띄워보자. 이번에는 브라우저에서 http://localhost:8000/admin 이라고 입력

[uscript] 1장. 스크립트 관리자 개요

이미지
SI 업무를 하면서 가장 많이 작성하게 되는게 SQL 쿼리문인데, 쿼리문을 다음에 사용하기 위해 폴더로 관리를 해도 나중에 다시 사용하려면 찾기 어려운 경우가 많다. 어떻게 분류를 잘하더라도 시간이 지나면 어떤 이름으로 저장했는지 찾기가 어려워 스크립트 관리자를 만들어 볼 생각을 하였다. 내용은 간단하다. 블로그처럼 제목, 내용으로 작성하고 제목, 내용, 태그를 통해서 검색을 할 수 있는 간단한 기능을 구현한다. 그리고 스크립트를 업로드, 다운로드를 할 수 있게 구현하여 작성한 스크립트를 서버로 바로 올릴 수 있게 작성할 예정이다. 만든 소스는 아래의 github 사이트에서 다운로드 가능하다. https://github.com/shsong97/uscript.git 실제로 활용하기 위해 Heroku에 서비스로 올려뒀다. http://uscripts.herokuapp.com/scripts/ 완성된 모습은 다음과 같이 될 것이다.

웹페이지로 엔젤이 수다펜 만들기

이미지
주말이라고 토이저러스에 놀러갔는데 사고 싶은게 없냐고 물어보니 사고 싶은게 없다고 해서 집으로 오려는데 오는 길에서 수다펜이 사고 싶다고 하는겁니다. 토이저러스에서 말했으면 사줬을것 같은데 인터넷으로 판매하는걸 보니 매장에서 사는것보다는 싼것 같아서 일단은 나중에 인터넷으로 사준다고 하고 집으로 왔는데 프로그램을 하는 사람으로서 웹페이지로 만들어주면 어떨까 하는 생각에 급하게 만들어 봤습니다. 개발 환경은 django인데 이번 페이지는 django와는 상관은 없고 웹서버 띄우는 용도로만 사용했습니다. Html 코드는 아래와 같이 만들었습니다. 스타일 시트 부분 배경화면이 되는 이미지를 div 태그에 넣기 위해 back_ground 라는 이름으로 id를 만듭니다. 그리고 버튼을 클릭하면 나오는 audio tag는 화면에서 보이지 않게 숨겨두었습니다. body 안에는 div 태그로 아래와 같이 작성합니다. 버튼을 클릭시 소리가 나오도록 input type에 button으로 작성하고 onClick시 EvalSound 함수를 작성합니다. input class는 bootstrap을 이용하여 버튼을 표시한 것이고 필요없으면 삭제해도 됩니다. 가중 중요한 소리 파일입니다. audio 태그는 Html의 마지막 부분에 추가로 넣으면 됩니다. 오디오 파일의 경우는 마이크가 없어서 스마트폰에서 음성녹음을 하고 녹음된 파일을 PC에 저장하였습니다. 버튼을 클릭시 수행할 자바스크립트입니다. EvalSound는 audio 태그를 찾아서 play를 실행해주는 함수이고 randSound는 등록된 audio중 랜덤으로 소리를 실행해주는 함수이다. 실제로 구현된 화면입니다. 수다펜은 아니지만 어차피 원리는 비슷하니까요. 웹으로 구현을 해주니 좋아하네요. 그래도 수다펜은 사달라고 합니다 ^^