python으로 개발하다가 외부라이브러리를 쓰다보면 많이 보는 글자가 바로 *args 또는 **kwargs 다.


한마디로 말해서 어떤 값을 넣을진 모르는데 *args는 값을 넣으면 함수에 변수가 튜플형태로 입력되는 것이고, **kwargs는 딕셔너리 형태로 입력되는 것이라고 보면 된다.


def a(*args):

print args


a(1,2,3,4,)


==> (1,2,3,4)


def b(**kwargs):

 print kwargs


b( a=1, b=2, c=3)


==>{ a:1, b:2, c:3}



예전에 개발 선생님에게 물어봤을 때는 설명해줘도 뭔말인지 잘 몰랐고 왜 써야 하는지도 이해를 못했는데 class를 이용해 객체를 만들어 코딩하는 방법을 사용하다보니 자연스럽게 개념을 알게 되었다.


class를 기반으로 코딩을 하다보면 변수를 일일히 받아야 하는 경우도 있지만 있어도 되고 없어도 되는 그런 변수를 받아야 하는 경우도 있다.


예를 들어 get 방식으로 api를 호출 할때 필수적으로 들어가야 하는 변수들도 있지만 그렇지 않은 변수들도 있다.


http://www.sampleapi.com/api?a=1&b=2&c=3


위와 같은 URL이 있을 때

이 URL을 호출하는데 a변수는 필수적인 변수고 b와 c는 별 상관없는 변수라고 해보자


만약 class를 static하게 만든다고 하면


import requests


class SampleApi:


def __init__(self, url, a, b, c):

self.url = url

self.a = a

self.b = b

self.c = c


def getUrl(self):


url = self.url + "a=" + self.a + "&b=" + self.b + "&c=" +self.c


response = requests.get(url)


return response




sample = SampleApi( "http://www.sampleapi.com/api?", "1", "2","3" )

a = sample.getUrl()



이런 식으로 코딩을 해야 한다.

근데 **kwargs를 쓰면 쓰는 입장에서 변수입력을 보다 간단하게 해결 할 수 있다.



import requests


class SampleApi:


def __init__(self, url, a):

self.url = url

self.a = a


def getUrl(self, **kwargs):


optionUrl = ""


if kwargs.has_key("b"):


optionUrl += "&b=" + kwargs["b"]


if kwargs.has_key("c"):


optionUrl += "&c=" + kwargs["c"]


url = self.url + "a=" + self.a + optionUrl


response = requests.get(url)


return response




sample = SampleApi( "http://www.sampleapi.com/api?", "1" )


#아무런 변수도 입력 안된 경우

a = sample.getUrl()


#변수 b만 입력한 경우

a = sample.getUrl(b="2")


#변수 c만 입력한 경우

a = sample.getUrl(c="3")


#변수 b,c를 모두 입력한 경우

a= sample.getUrl(b="2", c="3")


이전에는 모두 넣어야 했던 것과 달리 원하는 형태로 변경이 가능해진다.


거의 3년이 다 되서야 써먹다니;;;

ㅋㅋㅋㅋ 갑갑한 개발자로다...

https://github.com/lorin/mezzanine-paas


한방에 해결했다.


안돼서 꽤나 시간을 썼는데 허무...


암튼 샘플 앱을 올리면 끝난다~!!!


ㅋㅋㅋ

블로그 서비스를 쓰고는 있는데 아무래도 open api만 가지고는 이런저런 제약 사항들 때문에 맘에 들게 운영하는데 한계가 있다고 느껴져서 설치형 블로그를 찾아보고 있었다.

대표적이자, 가장 대중적인 Wordpress 는 php 기반이다보니 다뤄보지 못한 언어라 부담이 있는게 사실이었다.


이런저런 고민을 하고 있는데 문득 Django기반의 설치형블로그인 Mezzanine이 있던게 기억이 났다. 아무래도 php를 선호하는 웹개발자가 많다보니 다소 생소할 수 있는 서비스라고 생각이 된다. 예전에 중견 개발자 분과 우연찮게 django 스터디를 잠깐 한적이 있었는데 그 때 그 분이 극찬을 하며 소개해줘서 알게 되었는데 wordpress에 뒤지지 않게 많은 기능들을 지원했던 것으로 기억이 됐다.


특히 Django의 경우, Heroku하고 잘 붙어서 서버 구축에 대한 부담도 줄일 수 있다는 장점이 있다.


아직 설치해보진 않았지만 아래 사이트를 참고해서 구축해보려 한다.


http://www.benhavilland.com/blog/deploying-mezzanine-on-heroku/


 잊지말자..


heroku는 python을 지원한다.


만약 heroku에 대해서 잘 모르는 사람은 다음 사이트를 참고 바란다. (https://devcenter.heroku.com/articles/getting-started-with-python#introduction)


웹서버를 쓸일이 있었는데 여러모로 덩치가 큰  django보다 flask가 괜찮을 것 같아 쓰게 되었는데 heroku에서 flask를 쓸수 있다는 것을 처음 알게 되었다.

flask 자체가 하나의 파이썬 파일로 구성되어 있기 때문에 별다르게 할 건 없다.


"heroku dino 생성 --> 프로젝트 연결 --> git을 통해 deploy"


조금 고려할 사항이 있다면 Procfile을 구성하는 것인데 제대로 서비스를 해도 되지 않기 때문에 일단 다음과 같이 작성했다.


web: python flask_server.py

그냥 개발서버 작동시키는 명령어를 쓴거라 작동은 하지만 제대로 된 서비스를 하는 사람에게 권장할 수 있는 방식은 아닌 듯 하다.


그 후에 조금 찾다보니 heroku와 연동하는 라이브러리가 있어 아래에 남겨 놓는다.



참고사이트

- https://github.com/zachwill/flask_heroku

https://github.com/kennethreitz/flask-heroku

개발하는 프로젝트에 스케쥴링 관련 사항이 있다면 반드시 써야 하는 기능이 바로 datetime 모듈이다.

datetime 모듈은 기본 내장 모듈로 대부분의 날짜 관련 기능을 지원하는 강력한 모듈이다


Heroku에 flask서버를 올리게 됐는데, 입력 받은 시점을 기록해야 하는 기능이 필요해서 위 모듈을 쓰게 됐다.

그런데 Heroku region을 미국으로 설정했더니 현재 시점의 시간의 미국기준으로 출력되는 현상이 발생했다.(참고로 우리나라 시간보다 9시간 전)


이런저런 해결책을 찾아봤는데 그냥 단순하게 서버 시간에서 9시간을 추가 하는게 가장 간단한 방법이라 시간을 더하고 빼는 기능을 찾아보았다.


간단하게 이야기해서 "현재시점 구하기" --> "더하거나 뺄 시간을 만들기" --> "+ or - 하기 " 이런 순서를 따른다.


python에서는 시간 단위를 만들기 위해서 timedelta()라는 함수를 이용한다.

아래 사이트를 참고하자면 다음과 같다


class datetime.timedelta([days[seconds[microseconds[milliseconds[minutes[hours[weeks]]]]]]])


예를 들어 9시간 전이라면 아래와 같다.


import datetime


currentTime = datetime.datetime.today()

nineHours = datetime.timedelta(hours=9)


nineHoursAfter = currentTime + nineHours


참고사이트

http://egloos.zum.com/oniondev/v/9687574

처음 개발을 시작 했을 때 웹개발을 좀 해보고자 시작 했었다.

평소에 친한 개발자 친구가 항상  python을 극찬했기 때문에 별 생각없이 개발공부 시작을 python으로 했는데, 당시 웹개발에 있어서 python은 마이너한 친구라는 걸 나중에서야 알았다. 물론 린 개발론이 유행을 타던 시절이라 django가 새롭게 조명받고 있긴 했지만 메이저한 시장에서는 자바나 닷넷등을 쓰던 시절이라 python으로 웹개발을 한다고 하면 일부 사람들은 무슨 웹개발을 python으로 하냐며 웃고 지나가던 그런 경우도 있었다.


그럼에도 불구하고 python을 권장해준 친구가 무슨 말을 그리하냐며 엄청 쉽고 간단하다며 flask를 소개해줬는데, 당시만 해도 웹서버 뭐하는 놈인지 개념조차 없던 시절이라 겁나 어려운걸 소개해줘놓고 쉽다고 하니 장난하나 싶었던 기억이난다.


당시에는 python으로 웹개발하는 걸 소개하는 책도 없어서 뒤지고 뒤져서 딱 한권 나왔는데 아래 서적이었다.


파이썬 웹 프로그래밍
국내도서
저자 : 주성식,홍성민
출판 : 위키북스 2014.01.28
상세보기

 

지금와서 하는 말이지만 비개발자에게 이 책은 정말 추천할수가 없다.

이미 어느 정도  개발을 하고 있다는 것을 전제하고 쓴 책이란 느낌을 지울수가 없는게 한마디로 말해 책에 나온 예제를 따라할 수가 없다.

상황이 그러하다 보니 당시에는 좀 보다가 그냥 포기했었다.


그러다 어제 tistory 오픈 api를 써서 글을 올리는 것을 구현하는 중 redirect url을 제공해야 하는 상황이와서 웹서버를 써야 하나 싶다가 문득  flask가 생각났다.

물론 책을 다시 펼처본건 아니고 flask 홈페이지로 가서 간단한 설치 및 사용법을 보고 웹서버를 만들어봤는데 한마디로 "초간단"


당시에 추천해준 친구를 원망 했던 것을 미안하게 생각하며 간단하게 한번 살펴보면 다음과 같다.



홈페이지: http://flask.pocoo.org/docs/0.11/ 


1.설치

언제나 그렇 듯 python은 pip가 진리...그냥 아래 명령어를 bash에서 입력하면 끝난다.

$ pip install Flask

2.python 파일 하나 만들기 

이름은 whatever...그냥 만든다.

내 경우에는 flask_server.py라는 파일을 만들었다.


파일 안에 코드는 다음과 같다.

# -*- coding: utf-8 -*-
from flask import request
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():


return "hello"




if __name__ == "__main__":

app.run()


3. flask 서버 시작

아래 명령어를 넣어주면 서버가 시작된다.

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/

4. 확인

웹서버는 지금 http://localhost:5000에서 돌아가고 있다.

해당 주소를 치면 "hello"가 출력되는 것을 볼 수 있다.



이렇게 간단하다.

물론 추가적인 모듈이나 라이브러리를 일일히 추가해줘야 한다는 점에서 기능이 복잡한 앱을 개발한다면 django에 비해 불편한점이 있지만 간단한 request, response만 하는 간단한 웹서버라면 강추 한다. 


참고

- http://flask-docs-kr.readthedocs.io/ko/latest/

특정 사이트를 긁어오는데 유용한  Beautifulsoup을 써서 사이트를 긁어오는 작업을 하는 중이었다.


해당 사이트의 순위 정보를 긁어와서 리스트에 [{1:키워드1}, {2:키워드2}] 이런 식으로 담아 넣는 작업을 하게 되었다.

그런데 Python 인터프리터는 Dictionary 안에 한글값이 있을 때 유니코드값을 쏟아내다보니 순위 정보가 제대로 담겨있는지 확인하는데 어려움이 있었다.


Dictionary의 값을 확인하는 방법은 ditionary[key값]으로 확인을 해야 하는데 각dictionary별로 키값이 어떻게 되는지 확인하는 방법이 뭐가 있는지 확인하다보니 dictionary.keys() 함수가 있는 것을 발견했다.


list = [{1:키워드1}, {2:키워드2}, {3:키워드3}]

for i in list:

keyList = i.keys()

print i[keyList[0]]


위와 같은 코드를 돌리면 아래와 같은 값이 출력된다.


키워드1

키워드2

키워드3


솔직히 너무 쉬운 코드긴 한데 암튼 잊지 말자는 의미에서...ㅋ

최근 구글의 firebase 실시간 데이터베이스에 흥미가 생겼기 때문에 이것 저것 해보는 중인데, 그 중에서도 Rest API를 python에서 다루는 것을 실험해보기 위해 python firebase 라이브러리를 설치하게 되었다. 


firebase 공식 사이트에서는 아래 두 python 라이브러리를 소개하고 있다.

1. https://github.com/mikexstudios/python-firebase

2. http://ozgur.github.io/python-firebase/


pip를 지원하기 때문에 아래 명령어를 통해 설치를 하고 IDE인 pycharm을 켜고 프로젝트를 만들었다. 


pip install -e git://github.com/mikexstudios/python-firebase.git#egg=python-firebase


그런데 "from firebase import firebase"가 인식이 안되는 현상이 발생했다.

왜그런가 확인을 하다보니 compile하는 python의 버전이 아까 터미널에서 확인한 버전과 다른 것이 확인이 되었다.


데이터 분석을 공부해보기 위해 Canopy 를 설치하다보니 python버전이 2.6/2,7 두 개가 설치 되어 있었다보니 pip로 설치를 하면 default로 설정되어 있는

Canopy 설치 시에 깔려 있던 2.7.11버전에 라이브러리가 설치되어 있었는데, pycharm에는 2.6.9버전이 컴파일하다보니 라이브러리가 없는 것으로 인식된 것이다.


그래서 버전이 다른 python에  pip로 설치하는 방법을 찾아봤는데 제대로 된 답을 얻을 수가 없었다.

결국 github에 있는 소스를 다운 받은 다음 python setup.py install를 통해 직접 설치하여 해결 할 수가 있었다.


혹시라도 삽질하는 사람 있으면 그냥 직접 설치하시는 방법을 권장한다.

<본 강좌는 Mike Hibbert에 의해 제작되었으며, 제가 정리한 내용이 도움이 된다고 생각되시면 반드시 유투브 페이지에 방문하셔서 추천과 구독을 눌러주세요>

 

이번 강좌에서는 전 강좌에서 urls.py를 app안에 넣었던 것과 같이 templates을 app안에서 쓸 수 있는 방법을 소개한다고 합니다.

template의 modulerize라고 하는데...뭐 자세한 내용은 동영상을 들으시고,

우선 template을 최초에 만든 django_test/templates 에서도 쓸수 있고, article/templates에서도 쓸수 있으려면 어떻게 해야 할까요?

 

이 경우에는 django_test/settings.py를 변경하면 된다.

위 화면 가장 하단에 있는 TEMPLATE_DIRS = ( ROOT_PATH + '/templates') 으로 되어 있던 설정을 다음과 같이 변경한다.

TEMPLATE_DIRS = ( ROOT_PATH + '/templates',
                  ROOT_PATH + '/articles/templates',
)

위와 같이 변경할 경우 articles/templates에서도 지정한 html 파일이 있는지 확인하기 시작한다.

따라서, article app에 해당하는 내용에 대한 template들만 별도로 모아서 관리할 수 있게 됐다고 볼 수 있다.

Django에서 제공하는 Template 문법

자 그럼 django에서 제공하는  template 문법을 보다 구체적으로 살펴보도록 하자.

전장에서 쓴 articles.html파일의 내용을 보면 다음과 같다.

{% for article in articles %}   
<div>

   <h2><a href="/articles/get/{{ article.id }}/">{{article.title}}</a></h2>
   <p>{{article.body}}</p>

 </div>
{% endfor %}

 

 

<결과 화면>

위에 출력되는 내용들을 django template문법으로 제공하는 일부 기능을 제공하면 다른 결과를 얻을 수 있다.

Django 문법은 "|" 를 사용한다.

예를들어 <p>{{article.body}}</p> 를 <p>{{article.body|upper|truncatewords:"10"}}</p> 와 같이 변경하면,

출력되는 내용이 upper 즉 모두 대문자로 변경되며, truncatewords:"10"는 출력되는 글의 길이가 10으로 조정되고 나머지는 ...으로 요약 된다.(lower로 변경하면 모두 소문자가 된다.)

{% for article in articles %}
  <div>
   
   <h2><a href="/articles/get/{{ article.id }}/">{{article.title}}</a></h2>
   <p>{{article.body|upper|truncatewords:"10"}}</p>
   
   
  </div>
{% endfor %}

 

 <결과화면>


 

django Template에서는 python의 if문과 유사한 if문을 제공한다.]

아래와 같이 if문을 쓰는 방법은 python문법과 거의 동일하다고 보면 된다.

{% if articles.count > 0 %}
  {% for article in articles %}
  <div>
   
   <h2><a href="/articles/get/{{ article.id }}/">{{article.title}}</a></h2>
   <p>{{article.body|upper|truncatewords:"10"}}</p>
   
   
  </div>
  {% endfor %}
  
  
{% else %}

 <p>None to show!!</p>
 
{% endif %}

 <결과화면>

if문에서 <를 반대로 설정하면 else에 설정해 놓은 구문이 출력된다.

{% if articles.count < 0 %}
  {% for article in articles %}
  <div>
   
   <h2><a href="/articles/get/{{ article.id }}/">{{article.title}}</a></h2>
   <p>{{article.body|upper|truncatewords:"10"}}</p>
   
   
  </div>
  {% endfor %}
  
  
{% else %}

 <p>None to show!!</p>
 
{% endif %}

<결과화면>

 

 

다음으로는 기본적인 layout을 설정하는 방법을 보자. 어찌보면 가장 핵심적인 내용인데, Tutorial에는 나중에 나온다.ㅎㅎ

우선 기본적인 layout역할을 할 파일을 articles/templates에 base.html이란 이름으로 만들어보자

 

 

 

base.html에 들어갈 내용은 다음과 같다.

<!DOCTYPE html>
<html lang="en">
 
 <head>
  <title> {% block title %}My Base Template{% endblock %}</title>
  <style type="text/css">
   body {
    text=align:center;
   }
   
   #page {
    width:960px;
    text-align:left;
    margin: 10px auto 20px auto;
    background-color:#0c0c0c;
    
   }
   
   #sidebar {
    
    float: left;
    width: 200px;
    border: 1px solid #000;
   } 
   #content {
    float: left;
    width: 600px;
    border: 1px solid #f00;
    padding: 10px;
    }
      
  </style>
  
 </head>
 <body>
  <div id="page">
   
   
  </div>
  <div id="sidebar">
   {% block sidebar %}
   <ul>
    <li><a href="/articles/all"> Articles </a></li>
    <li><a href="/admon/"> Admin</a></li>
    
   </ul>
   {% endblock %}
  </div>
  <div id="content">
   
   {% block content %}This is content area {% endblock %}
   
  </div>
 </body>
 
 
</html>

약간의 css가 들어가서 다소 복잡해 보일 수 있으나 핵심은 {% block something %}으로 정리되는 부분이다.

기본적인 layout 외 변경이 될 부분들을 {% block somting %}{% endblock %}으로 설정해 놓으면 그 부분에 변경될 내용을 HTML파일로 만들어서 삽입할 수 있게 된다. 좀 더 쉬운 이해를 위해서 위 파일을 브라우져에서 실행한 화면을 보자.

 

위 화면을 보면 {% block sidebar %}{% endblock %}과 {% block content %} {% endblock %}으로 설정된 두 영역이 보인다.

위 두 영역은 다른 html 파일을 만들어서 {% extends 'base.html' %} 을 입력하면 기본 layout으로 사용할 수 있고, 삽입을 원하는 영역을 선택하기 위해서 {% block sidebar %} 또는 {% block content %}을 입력하면 html에 작성된 내용이 layout 상의 block 영역에 삽입된다.

아까 만들었던 articles.html / article.html 파일을 적용시키면 다음과 같다.

articles.html

{% extends 'base.html' %}

{% block content %}
  
{% if articles.count > 0 %}
  {% for article in articles %}
  <div>
   
   <h2><a href="/articles/get/{{ article.id }}/">{{article.title}}</a></h2>
   <p>{{article.body|upper|truncatewords:"10"}}</p>
   
   
  </div>
  {% endfor %}
  
  
{% else %}

 <p>None to show!!</p>
 
{% endif %}

{% endblock %}
 

<결과 화면>


article.html

{% extends 'base.html' %}
{% block sidebar %}
<ul>
 <li><a href="/articles/all"> Articlse</a></li>
 <li><a href="/admin/"> Admin</a></li>
</ul>
{% endblock %}

{% block content %}

  <h1> {{article.title}}</h1>
  <p>{{article.body}}</p>
 
{% endblock %}

 <결과 화면>

 

 

 


 

 

<본 강좌는 Mike Hibbert에 의해 제작되었으며, 제가 정리한 내용이 도움이 된다고 생각되시면 반드시 유투브 페이지에 방문하셔서 추천과 구독을 눌러주세요>

Tutorial5은 django의 admin 페이지에 models.py에 만들어놓은 model을 admin에서 직접 보고 관리할 수 있도록 설정하는 것을 보여준다.

 

 

이클립스에서 django 프로젝트를 생성하고, 프로젝트에서 app을 만들면 app폴더 안에 admin.py 파일이 기본적으로 존재한다.

 

article/admin.py 를 열면 아래와 같이 출력이 된다.

위와 같이 나온 화면에 다음과 같이 추가하면 admin페이지에 models.py에 정의한 각각의 Table이 등록된다.

 

 

 

admin.py를 모두 작성하였으면, django_test/urls.py로 들어가서 admin으로 접속할 수 있는 url이 있는지 확인한다. 이클립스를 사용할 경우 기본적으로 입력되어 있으나, 만약 없을 경우에는 아래와 같이 admin 페이지로 이동할 수 있는 경로 url(r'^admin/', include(admin.site.urls)),를 만들어 준다.

 

그리고, http://127.0.0.1:8888/admin/ 을 브라우저에 입력하면 admin 페이지에 접속할 수 있다. 만약 id와 password를 묻는다면, syncdb를 처음 할 때 입력했던 계정 정보를 입력하도록 한다.

 

 

admin 화면에서 Articles에 들어가면 models.py에서 작성한 class Article의 결과물을 직접 눈으로 볼 수 있으며 데이터의 입출력 또한 자유롭게 할 수 있다.

 

 

 

 

 

+ Recent posts