/* 
written by kaspy (kaspyx@gmail.com)
*/ 

파이썬 SimpleHTTPAuthServer를 이용해서 간단한 HTTP서버를 구축해보도록하자.


서버 내부 파일 다운로드가 필요하면서 인증이 필요한 환경이라면 사용해도 좋을것이다.


해당 파이썬 라이브러리는 아래 URL에서 다운로드 받을수 있다.


- 다운로드 URL


https://gist.github.com/fxsjy/5465353



- pip 으로 설치하기


pip install git+git://github.com/tianhuil/SimpleHTTPAuthServer.git@master



- 사용법


mkdir "공유할 디렉토리"

cd "공유할 디렉토리"

python -m SimpleHTTPAuthServer portnumber userid:pwd


나는 아래와 같이 명령어를 입력해줘서 서버를 구축해줬다.


mkdir myftp

cd myftp

touch hello

sudo python -m SimpleHTTPAuthServer 80 kaspyx:12345



명령어를 실행해주고 자신의 아이피에 접속하면 아래와같이 접속 인증을 입력하라는 창이 뜰것이다.


위에서 설정한데로 입력해주면 아래와같은 디렉토리 리스팅이되는 화면을 볼수있을것이다.







저작자 표시
신고
Posted by 캐스피
/* 
written by kaspy (kaspyx@gmail.com)
*/ 


번 포스팅에 이어서 이번에는 장고(Django)를 이용해서 웹페이지를 추가하고 이에대한 요청을 처리하는 웹페이지를 만드는 과정을 다루어보도록하겠습니다.


구현된 소스코드에는 자세히 다루지는 않겠지만 따라하기만 해도 어느정도 이해하는데 도움이 될것으로 생각합니다. 


개발 환경은 Ubuntu Linux 16.04 기준


1. 기본 프로젝트 및 구조 생성하기


우선 장고를 사용한 웹서버 구축하기를 먼저보고 오는게 좋을것이다. - link


1) 프로젝트 생성


 웹서버라면 제공하는 서비스에따라 다양한 요청을 처리할수있어야한다. 우선 프로젝트를 추가하고 어플리케이션을 추가하도록 하겠다.


이번 포스팅에서는 설문조사를 하는 사이트를 만들어보도록 하겠다.


아래 명령어를 실행하여 프로젝트를 만들어준다.


django-admin startproject mysite


2) 어플리케이션 생성


생성한 프로젝트로 경로를 옮긴다음에 app을 추가해주도록하자. 

(polls 라는 어플리케이션을 추가)


cd mysite

python manage.py startapp polls


3) 데이터 베이스 변경사항 반영


아래는 데이터베이스 변경사항이 있을때 이를 반영해주는 명령어입니다.


cd mysite

python manage.py migrate 

 

지금까지 한 작업이 잘 반영되어있는지 아래 명령어로 확인할수있음. (이전 포스팅에도 나와있음)


python manage.py runserver 0.0.0.0:8000



관리자 아이디 추가하기


cd mysite

python manage.py createsuperuser 


웹사이트가 만들어졌으니 위의 명령어로 관리자 아이디를 추가해야한다.


이제 프로젝트가 만들어졌을텐데 구조는 아래와같은 구조로 되어있을것이다.



2. MTV 패턴으로 웹페이지 개발하기


 장고(Django)는 기본적으로 MVC(Model View Controller) 패턴기반 MTV 개발을 지원한다. MTV 패턴이란 MVC 거의 같지만 View를 Template을 Controller를 View로 사용한다는점에서 약어만 다르고 거의 비슷하다. 


Business logic이랑 View를 따로 분리/설계 하여 개발하는 기법을 말하는것인데, 여기선 자세힌 다루진않을거고 그냥 내부 로직과 UI가 따로있어서 웹개발자와 디자이너는 서로엮이지않고 자기할것만 할수있는 방법이라고 보면되겠다. 



위와 같은 설문조사 사이트를 만들어볼건데.. 솔직히 모든 내용을 한꺼번에 이해하기엔 쉽지않을것이다. 


분명 url 처리 및 정규표현식도 알아야하고, html 및 python 문법 및 함수도 잘숙지해야한다.


그러나 따라하면서 만들어보고 잘작동하는 서버 소스코드를 분석하다보면 하나씩 이해해가며 접근하는 접근법보다 이해가 쉬울것이니, 잘따라해보길바람

(보다가 머리가 아프다면 복붙 추천!!)


1) 데이터베이스 지정 및 APP 등록


데이터베이스 설정은 settings.py 파일을 열어서 수정해주면된다.


여기서는 기본적으로 지정되어있는 SQLite3를 사용할것이므로 수정해주지않아도 된다.


cd mysite/mysite

vi settings.py 


그러나 위에서 polls 라는 어플리케이션을 추가해줬으므로, mysite/settings.py 파일에 polls 어플리케이션을 등록해줘야한다.


settings.py 파일을 열어서 polls 라는 앱을 등록해주도록하자.



2) 테이블 정의


설문조사를 하는 사이트라면 당연히 DB를 사용해야할것이다. polls/models.py 파일을 수정해주도록하자.


cd mysite/polls

vi models.py 


테이블 클래스는 django.db.models.Model 클래스를 상속받아 정의하며, 각 클래스 변수의 타입도 장고에서 미리 정의된 필드 클래스를 사용한다.


  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class Question(models.Model):
  6.   question_text = models.CharField(max_length=200)
  7.   pub_date = models.DateTimeField('date published')
  8.  
  9.   def __unicode__(self):
  10.     return self.question_text
  11.  
  12. class Choice(models.Model):
  13.   question = models.ForeignKey(Question)
  14.   choice_text = models.CharField(max_length=200)
  15.   votes = models.IntegerField(default=0)
  16.  
  17.   def __unicode__(self):
  18.     return self.choice_text


3) Admin 사이트에 테이블 반영


추가된 DB 테이블을 아래와같이 반영해준다.


models.py 모듈에서 정의한 Question, Choice 클래스를 임포트하고 admin.site.register() 함수로 등록해주는 과정이다.


cd mysite/polls

vi admin.py


  1. from django.contrib import admin
  2.  
  3. # Register your models here.
  4.  
  5. from polls.models import Question, Choice
  6.  
  7. admin.site.register(Question)
  8. admin.site.register(Choice)


4) 데이터베이스 변경사항 반영


이제는 아래의 명령어로 생성한 데이터베이스를 반영하도록한다.


cd mysite

python manage.py makemigrations

python manage.py migrate 


makemigrations 명령어는 polls/migrations 디렉토리 하위에 마이그레이션 파일들이 생기고 이 마이그레이션 파일들을 이용하여 migrate 명령어 데이터에이스 테이블을 만들어준다.



변경사항이 잘 반영됬는지는 admin 사이트로 들어가서 관리자 아이디로 로그인하면 아래와 같이 확인할수있다.



5) 애플리케이션 개발하기 - View 및 Template 코딩해주기


앞서 polls 어플을 설계할때 3개의 페이지가 필요하였다. 물론 요청 흐름에대한 로직이 설계되어야하지만, 여기서는 4개의 URL과 뷰를 만들어서 어플을 설계해볼것이다.



① URL Conf 코딩해주기


url 경로는 app 경로에 나눠서 따로 해주는것이좋다


mysite 아래에 app 이 있으므로 우선 mysite url 부터 설정해준다.


cd mysite

vi urls.py


아래와 같이 코딩해주자.


  1. from django.conf.urls import include, include, url
  2. from django.contrib import admin
  3.  
  4. import polls
  5.  
  6. urlpatterns = [
  7.     url(r'^polls/', include('polls.urls',namespace = "polls")) ,
  8.     url(r'^admin/', include(admin.site.urls)),
  9. ]

cd mysite/polls/

vi urls.py



  1. from django.conf.urls import patterns, url
  2. from polls import views
  3.  
  4. urlpatterns = patterns('',
  5.         url(r'^$', views.index, name='index'),
  6.         url(r'^(?P<question_id>\d+)/$', views.detail, name='detail'),
  7.         url(r'^(?P<question_id>\d+)/results', views.results, name='results'),
  8.         url(r'^(?P<question_id>\d+)/vote/$', views.vote, name='vote'),
  9.     )

② 함수 index() 및 템플릿 작성

cd mysite/polls/

mkdir templates

mkdir templates/polls

cd templates/polls

vi index.html


  1. {if latest_question_list %}
  2.     <ul>
  3.     {for question in latest_question_list %}
  4.         <li><a href="/polls/{{question.id}}/">{{question.question_text}}</a></li>
  5.     {% endfor %}
  6.     </ul>
  7. {else %}
  8.     <p> No polls are available.</p>
  9. {% endif %}


③ polls 어플리케이션 view 함수 작성


cd mysite/polls/

vi views.py


  1. from django.shortcuts import render
  2. from django.shortcuts import get_object_or_404
  3. from django.http import HttpResponseRedirect, HttpResponse
  4. from django.core.urlresolvers import reverse
  5. from polls.models import Question
  6.  
  7. def index(request):
  8.     latest_question_list = Question.objects.all().order_by('-pub_date')[:5]
  9.     context = {'latest_question_list': latest_question_list}
  10.     return render(request, 'polls/index.html', context)
  11.  
  12. # Create your views here.
  13.  
  14. def detail(request, question_id):
  15.     question = get_object_or_404(Question, pk=question_id)
  16.     return render(request, 'polls/detail.html',{'question':question})
  17.  
  18. def vote(request, question_id):
  19.     p = get_object_or_404(Question, pk=question_id)
  20.     try:
  21.         selected_choice = p.choice_set.get(pk=request.POST['choice'])
  22.     except (KeyError, Choice.DoesNotExist):
  23.         return render(request, 'polls/detail.html', {
  24.                 'question':p,
  25.                 'error_message':"You didn't select a choice.",
  26.                 })
  27.     else:
  28.         selected_choice.votes += 1
  29.         selected_choice.save()
  30.         return HttpResponseRedirect(reverse('polls:results', args=(p.id,)))
  31.  
  32. def results(request, question_id):
  33.     question = get_object_or_404(Question, pk=question_id)
  34.     return render(request, 'polls/results.html',{'question':question})


④ polls 어플리케이션 내에 detail.html 및 results.html 작성

cd mysite/polls/templates/polls

vi detail.html 


detail.html

  1. <h1> {{ question.question_text }}</h1>
  2.  
  3. {% if error_message %}<p><strong>{{ error_message }} </strong></p>{% endif %}
  4.  
  5. <form action="{% url 'polls:vote' question.id %}" method="post">
  6. {% csrf_token %}
  7. {% for choice in question.choice_set.all %}
  8.     <input type ="radio" name="choice" id="choice{{ forloop.counter }}" value="{{choice.id}}" />
  9.     <label for= "choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br/>
  10. {% endfor %}
  11. <input type = "submit" value="Vote" />
  12. </form>

results.html (위와 동일한 경로)

  1. <h1> {{ question.question_text }} </h1>
  2.  
  3. <ul>
  4. {% for choice in question.choice_set.all %}
  5.     <li> {{ choice.choice_text }} -- {{ choice.votes }} vote {{ choice.votes|pluralize }} </li>
  6. {% endfor %}
  7.  
  8. <a href= "{% url 'polls:detail' question.id %}"> Vote again?</a>



3. 최종 확인하기


위의 순서데로 잘따라해서 코딩해주었다면 polls로 접속시에 아래와 같은 메시지 화면을 볼수있을것이다.



이젠 admin 사이트로 들어가서 질문목록 Choices 와 Questions을 수정하여 설문항목을 추가해주도록하면된다.




* 참고 자료 


Django로 배우는 쉽고 빠른 파이썬 웹 프로그래밍

저작자 표시
신고
Posted by 캐스피
/* 
written by kaspy (kaspyx@gmail.com)
*/ 


장고(Django)란 파이썬으로 구현된 웹 개발 프레임워크로 무료 오픈소스로 배포되며 웹서버 개발 및 관리가 용이한 장점을 가지고있습니다.

이번 포스팅에서는 리눅스(Ubuntu) 환경에서 장고를 설치하고 간단한 웹서버를 만드는내용을 다루도록 하겠습니다.

장고를 사용한 웹서버 구축은 정말이지 쉽다~!!

1. 장고(Django) 설치하기

sudo apt-get install python-django


장고가 잘 설치되었으면 python 명령어를 실행하여 Django 버젼을 확인할수있다.

python

import django

print django.get_version() 


kaspyx@kaspyx-Virtual-Machine:~$ python

Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> print django.get_version()
1.8.7
>>> quit()



2. 웹서버 구동하기

장고(Django)가 잘 설치되었으면 간단하게 웹서버를 구동할수있다.

django-admin 명령어로 프로젝트를 만들고 웹서버를 가동해보자

django-admin startproject mysite # mysite 프로젝트 생성

python manage.py migrate # DB 변경사항 저장

python manage.py runserver # 서버 구동


위에 명령어를 순서대로 치면 아래와 같은 화면을 볼수있을것이다.



- 관리자 아이디 만들기

 

웹사이트가 있다면 당연히 관리자 아이디가 필요할것이다. 웹사이트 관리자 페이지도 자동으로 만들어진다.


http://127.0.0.1:8000/admin


관리자 페이지는 끝에 /admin 만 추가해주면 접속할수있다. 그러나 우리는 아직 관리자 아이디가없다.


아래의 파이썬 장고 명령어를 사용하여 관리자 아이디를 추가해주록 하자.


python manage.py createsuperuser 


만들어진 아이디 및 패스워드로 admin 사이트에 로그인하면 잘되는것을 확인할수 있을것이다.



접속은 웹브라우저에서 localhost(127.0.0.1)로 하면된다.




* 참고 자료 


Django로 배우는 쉽고 빠른 파이썬 웹 프로그래밍


저작자 표시
신고
Posted by 캐스피


/* 
written by kaspy (kaspyx@gmail.com)
*/ 


파이썬을 사용하여 리눅스 및 윈도우의 콘솔 프로그램을 통해 입력 인자를 보다 편리하게 넘겨줄수 있다.


이방법은 보통 S/W 결함 및 Security 테스팅 등에 사용된다.


1. gets() 또는 scanf() 함수 등에 넘길때


  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.   char buf[32];
  6.   gets(buf);
  7.   printf("You enterd string 1: %s\n",buf);
  8. }
  9. // gcc -o gets_test gets_test.c

위와 같은 코드에 파이썬(python) 스크립트를 사용하여 입력 인자를 넘길수 있다.


 (python -c 'print "a"*4';cat) | ./gets_test


만약 입력 함수가 여러개라면??


  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.   char buf[32];
  6.   scanf("%s",&buf);
  7.   printf("You enterd string 1: %s\n",buf);
  8.   scanf("%s",&buf);
  9.   printf("You enterd string 2: %s\n",buf);
  10.   scanf("%s",&buf);
  11.   printf("You enterd string 3: %s\n",buf);
  12. }
  13. // gcc -o gets_test2 gets_test2.c



 (python -c 'print "c"*4';cat) | (python -c 'print "b"*4';cat) | (python -c 'print "a"*4';cat) | ./gets_test2


위와같이 '|' 를 사용하여 거꾸로 넣어주면 된다.


aaaa, bbbbb, cccc가 순서데로 들어가서 출력된다.




2. argv에 넘겨줄때



  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(int argc, char* argv[])
  5. {
  6.   char buf[32];
  7.  
  8.   strcpy(buf,argv[1]);
  9.  
  10.   printf("Your argv's strings are : %s\n",buf);
  11.  
  12. }
  13. // gcc -o argv_test argv_test.c


./argv_test `python -c  'print "a"*4'`


만약 argv를 아래와 같이 여러개 받는다면?


  1. int main(int argc, char* argv[])
  2. {
  3.   char buf[32];
  4.   char buf2[32];
  5.  
  6.   strcpy(buf,argv[1]);
  7.   strcpy(buf2,argv[2]);
  8.  
  9.   printf("Your argv's strings are : %s %s\n",buf,buf2);
  10.  
  11. }

이때는 아래와 같이 공백(" ")을 포함해서 넘겨주면 된다.


./argv_test `python -c  'print "a"*4+" "+"b"*4'`


순서대로 aaaa bbbb가 입력되었다고 출력된다.



3. nc명령어를 사용하여 네트워크 소켓을 통해 넘겨주기


nc 명령어와 결합하여 사용하면 네트워크를 통해서도 넘겨주는것이 가능하다.


예를들어 recv() 또는 read() 함수를 사용하여 네트워크 소켓 프로그래밍을 통해 입력값을 받는 프로그램이 있다고 해보자.


포트는 4949이고 아이피는 localhost 이다.


  1. char buf[256];
  2. int nread;
  3.  
  4. nread = recv( sock, buf, sizeof(buf)0 );
  5. buf[nread] = NULL;
  6. printf("You sent message : %s",buf);
  7. ...

(python -c 'print "a"*4' ; cat ) | nc localhost 4949


만약 입력이 여러개라면?


앞에서 한것이랑 똑같이 하면 된다.


(python -c 'print "c"*4' ; cat )| (python -c 'print "b"*4' ; cat ) | (python -c 'print "a"*4' ; cat ) | nc localhost 4949


이상으로 편리한 파이썬(python) 스크립트를 다루어보았다.


물론 단순히 저런 문자열만 넘길수 있는게 아니라, 문자열의 수식화, 헥스코드('\xff') 등도 넘길수 있으므로 잘활용하면 s/w 테스팅에 많은 도움이 될것이다.



저작자 표시
신고
Posted by 캐스피
/* 
written by kaspy (kaspyx@gmail.com)
*/ 

콘솔용 프로그램을 작성하다보면 같이 입력되는 명령어 인자(파라미터)들을 다루는데 많은 귀찮은 작업이 필요합니다.


여기서 인자들이란 아래와 같이


#-i : 입력 파일 이름

#-o : 출력 파일 이름

#-c : 특정 조건을 수행하라는 옵션


python example.py -i inputname -o outputname -c 


위와 같은 옵션을 처리해야하는 프로그램이라면 sys.argv[1:]의 인자를 파싱해가며 처리해줘야합니다.


이를 좀더 편하게 하기위한 getopt 함수를 사용해봅시다.

(설명이 귀찮으면 바로 예제코드 복붙해서 테스트해도 좋은방법입니다)


아래는 getopt 함수의 레퍼런스 입니다.


리턴값은 첫번째 옵션, 그리고 옵션 값으로 보면됩니다.


getopt.getopt(argsoptions[long_options]) 


args에는 입력받은 파라미터 문자열을 넣고 (일반적으로 sys.argv[1:])


두번째 options는 단일 문자 옵션, 그리고 long options는 긴문열 옵션이 입력됩니다.


아래는 체크 옵션 인자로 a,b,c,h, help 

(하나만 입력받는 옵션 인자)


입력 인자로 i, o, input,output 로 받기위한 예제 코드입니다.

(인자에 대한 추가 값을 받는 인자)


여기서 i,o 옵션은 추가 인자를 받기 때문에 ':' 문자를 (-i infile 이런식으로 입력)

input,output 또한 추가 인자를 받기 때문에 "=" 문자를 붙여줍니다. ( --input infile 이런식으로 입력)


  1. import sys
  2. import getopt
  3.  
  4. def help():
  5.   print "print help usage"
  6.   return
  7.  
  8. def main():
  9.   try:
  10.     # 여기서 입력을 인자를 받는 파라미터는 단일문자일 경우 ':' 긴문자일경우 '='을끝에 붙여주면됨
  11.     opts, args = getopt.getopt(sys.argv[1:],"abchi:o:",["input=","output=","help"])
  12.   except getopt.GetoptError as err:
  13.     print str(err)
  14.     help()
  15.     sys.exit(1)
  16.  
  17.   for opt,arg in opts:
  18.     if (opt == "-a"):
  19.       print "a option enabled"
  20.     elif ( opt == "-b"):
  21.       print "b option enabled"
  22.     elif ( opt == "-c"):
  23.       print "c option enabled"
  24.     elif ( opt == "-i" ) or ( opt == "--input"):
  25.       print "input file = "+arg
  26.     elif ( opt == "-o") or ( opt == "--output"):
  27.       print "ouput file = "+arg
  28.     elif ( opt == "-h") or ( opt == "--help"):
  29.       help()
  30.  
  31.   return
  32.  
  33. if __name__ == '__main__':
  34.   main()


아래는 위의 예제를 실행했을때 테스트한 경우에 따라 출력된 결과입니다.


잘못된 옵션('d')을 넣었을 경우



a,b 체크 옵션을 주고, i와 output 옵션을 주어 추가정보를 주었을 경우




a,b,c 체크옵션을 주고, -i와 --output을 이용해 추가 정보를 주고 h 옵션을 주었을 경우




- 참고 링크

https://docs.python.org/2/library/getopt.html


저작자 표시
신고
Posted by 캐스피
/* 
written by kaspy (kaspyx@gmail.com)
*/ 


 파이썬(Python)을 사용해서 간단하게 웹서버를 구축할수 있습니다. 이번 포스팅에서는 파이썬을 이용해서 웹서버를 구축하는 내용을 다루도록 하겠습니다.


* 웹서버용 파이썬 라이브러리 모듈

(세번째 CGIHTTServer 모듈은 다음 포스팅에 다루도록한다.)


모듈

내용

처리 기능

BaseHTTPServer

기반 서버 클래스용으로, HTTPServer 정의

핸들러 클래스용으로, BaseHTTPRequestHndler 정의

테스트용 서버를 실행하는, test() 함수 정의

기반클래스로,

HTTP 프로토콜 처리

SimpleHTTPServer

기반 서버 클래스인 HTTPServer 임포트하여 사용

핸들러 클래스용으로, SimpleHTTPRequestHandler 정의

테스트용 서버를 실행하는, test() 함수 정의

GET HEAD 메소드

처리 가능

CGIHTTPServer

기반 서버 클래스인 HTTPServer 임포트하여 사용

핸들러 클래스용으로, CGIHTTPRequestHandler 정의

테스트용 서버를 실행하는 함수 test() 정의

POST CGI 처리

 


1. BaseHTTPServer 모듈


  1. #!/usr/bin/env python
  2.  
  3. from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
  4.  
  5. class MyHandler(BaseHTTPRequestHandler):
  6.     def do_GET(self):
  7.         self.wfile.write("Hello world")
  8.  
  9. if __name__ == '__main__':
  10.     server = HTTPServer(('',8888), MyHandler)
  11.     print "Started WebServer on port 8888..."
  12.     print "Press ^C to quit webserver"
  13.     server.serve_forever()


3,5번 라인, BaseHTTPRequestHandler를 상속받아, 원하는 로직으로 핸들러 클래스를 정의합니다. 웹서버를 만드는 가장 기본적인 방법이다. 10번 번 라인에서 HTTPServer() 함수를 통해 서버 객체를 생성한후 13번 라인의 serve_forever() 함수를 통해 서버를 실행한다. 위의 파이썬 코드를 실행하면 아래와 같이 웹서버 객체가 실행되어 생성된다.


웹서버 실행


웹서버 접속했을때 결과


2. SimpleHTTPServer 모듈


 앞절에서는 웹서버를 만들기 위해 MyHandler라는 핸들러를 코딩하였다. SimpleHTTPServer 모듈 내에는 SimpleHTTPRequestHandler 클래스가 정의되어있는데, 이 핸들러에는 do_GET() 및 do_HEAD() 함수가 정의 되어있어서 아래와 간단한 명령어로 코딩없이 웹서버를 작동시킬수 있다. 아래 명령어는 실행한 경로에 디렉토리 리스팅이 되는 기능을 하는 웹서버이다.


python -m SimpleHTTPServer 8888 

#아래는 동일한 명령어

python -c 'import SimpleHTTPServer; SimpleHTTPServer.test()' 8888



파이썬 명령어를 실행한 모습

웹서버에 접속했을때 모습

* 참고 자료

django로 배우는 쉽고 빠른 파이썬 웹프로그래밍


저작자 표시
신고
Posted by 캐스피
/* 
written by kaspy (kaspyx@gmail.com)
*/ 

 파이썬은 코드가 간단하면서 어렵지않고 유용한 기능이 많다. 이번 포스팅에서는 파이썬에서 특정 웹사이트에 접속하여 이미지만 추출해서 다운로드하는 코드를 소개하겠다.

1. urllib2 모듈 예제

 아래 코드는 네이버 웹사이트에 접속해서 그림 (img tag) URL을 보여주는 파이썬 코드이다.


  1. #!/usr/bin/env python
  2. from urllib2 import urlopen
  3. from HTMLParser import HTMLParser
  4.  
  5. class ImageParser(HTMLParser):
  6.   def handle_starttag(self, tag, attrs):
  7.     if tag != 'img':
  8.       return
  9.     if not hasattr(self, 'result'):
  10.       self.result = []
  11.     for name, value in attrs:
  12.       if name == 'src':
  13.         self.result.append(value)
  14.  
  15. def parseImage(data):
  16.   parser = ImageParser()
  17.   parser.feed(data)
  18.   dataSet = set(for x in parser.result)
  19.   imgurl = '\n'.join( sorted(dataSet) )
  20.   print imgurl
  21.  
  22. def main():
  23.   url = "http://www.naver.com"
  24.   f = urlopen(url)
  25.   charset = f.info().getparam('charset')
  26.   data = f.read().decode(charset)
  27.   f.close()
  28.   print "\n>>>>> Fetch Images from", url
  29.   parseImage(data)
  30.  
  31. if __name__ == '__main__':
  32.   main()


5,6번 라인, HTMLParser 클래스를 사용할때는 이렇게 상속받는 클래스를 정의하고 필요한 내용을 오버라이드 하는 형태 구현되며 <img>라는 태그를 찾기위하여 handle_starttag() 함수를 오버라드이드 하였다. 11번 라인 for 루프가 있는데, <img src> 속성을 찾으면 속성값을 self.result 리스트에 추가하는 내용이다. 15번 라인 parseImage() 함수에 의해 <img> 태그 리스트를 출력해주는데, 17번 라인의 feed함수는 파싱하고 그결과를 parser.result에 추가해주는 내용이다.(ImageParser내부 객체) 특히 25번 라인, 사이트에서 가져온 데이터는 인코딩 되어있는데 이를 반드시 decode 해줘서 파싱해야함을 기억해야한다.


아래는 실행 결과 화면이다.



2. httplib 모듈 예제

 httplib 모듈은 urllib2 모듈의 상위 모듈로 urllib2도 이 모듈을 상속받아서 구현됬다고 한다. 이모듈은 urllib2 보다 좀더 저수준의 세밀한 기능이 필요할때 사용된다고 한다. 모듈을 활용하여 이번엔 결과 리스트에 존재하는 그림 파일들을 다운로드 하는 코드를 설명하도록 하겠다.

 아래는 네이버 웹사이트에 접속하여 그림파일들을 DOWNLOAD 디렉토리에 다운로드하는 파이썬 코드이다.


  1. #!/usr/bin/env python
  2.  
  3. import httplib
  4. from urlparse import urljoin, urlunparse
  5. from urllib import urlretrieve
  6. from HTMLParser import HTMLParser
  7. import os
  8.  
  9. class ImageParser(HTMLParser):
  10.   def handle_starttag(self, tag, attrs):
  11.     if tag != 'img':
  12.       return
  13.     if not hasattr(self, 'result'):
  14.       self.result = []
  15.     for name, value in attrs:
  16.       if name == 'src':
  17.         self.result.append(value)
  18.  
  19. def downloadImage(srcUrl, data):
  20.   if not os.path.exists('DOWNLOAD'):
  21.     os.makedirs('DOWNLOAD')
  22.  
  23.   parser = ImageParser()
  24.   parser.feed(data)
  25.   resultSet = set(for x in parser.result)
  26.  
  27.   for x in sorted(resultSet):
  28.     src = urljoin(srcUrl,x)
  29.     basename = os.path.basename(src)
  30.     targetFile = os.path.join('DOWNLOAD', basename)
  31.  
  32.     print "Downloading,..,", src
  33.     urlretrieve(src, targetFile)
  34.  
  35. def main():
  36.   host = "www.naver.com"
  37.  
  38.   conn = httplib.HTTPConnection(host)
  39.   conn.request("GET",'')
  40.   resp = conn.getresponse()
  41.  
  42.   charset = resp.msg.getparam('charset')
  43.   data = resp.read().decode(charset)
  44.   conn.close()
  45.  
  46.   print "\n>>>>>> Download Images from ", host
  47.   url = urlunparse(('http',host, '','','',''))
  48.   downloadImage(url,data)
  49.  
  50. if __name__ == '__main__':
  51.   main()


 7번 라인은 os 모듈은 21번 라인 makedirs() 함수를 실행하기위해 import 하였다. 24,25번 라인은 feed()함수를 사용하여 HTML 문장을 파싱하여 그결과를 바로 parser.result 리스트에 추가하고 이를 resultSet (set 자료 타입) 에 저장하는 코드는 다시한번 상기하기 위해 설명하였다. 

 for 루프문 안에 28번 라인은 다운로드 하기위한 URL과 타겟 파일명을 지정하는데, URL을 지정할때 urljoin() 함수를 사용한다. 이함수는 baseURL과 파일명을 합쳐서 완전한 URL을 리턴하는 함수이다. 

 이미지를 다운로드 하기위해 33번 라인 urlretrieve 함수를 사용하고 있다. 첫번째 인자 src의 url에 접속하여 두번째 인자 targetFile로 파일로 생성해준다. 38번 라인의 HTTPConnection 함수는 인자가 url이 아니라 host:port 임을 기억해야한다. port가 지정되지 않으면 default로 80 (http포트)로 지정된다. 47번 라인의 urlunparse 함수는 URL 요소 6개를 튜플로 받아서 이를 조립하여 완성된 URL을 리턴하는 함수로써 앞서 설명했던 urlparse() 함수와 반대되는 기능을 한다.



* 관련된 내부 링크 

파이썬 웹프로그래밍 - 웹클라이언트 urlparse 예제

파이썬 웹표준 라이브러리 소개 및 변경사항

* 참고 자료

django로 배우는 쉽고 빠른 파이썬 웹프로그래밍


저작자 표시
신고
Posted by 캐스피
/* 
written by kaspy (kaspyx@gmail.com)
*/ 


* urlparse 모듈은 주로 웹클라이언트 단에서 사용되는 parser 모듈이다.


1. urlparse 모듈

이 모듈은 URL의 분해, 조립, 변경 등을 처리하는 함수를 제공하며, parse한 결과를 리턴한다.



from urlparse import urlparse

result = urlparse("http://www.python.org:80:80/guido/python.html;philosophy?overall=3#n10")

result

ParseResult(scheme='http',netloc='www.python.org:80:80',path='/guido/python.html', params='philosophy', query='overall=3', fragment='n10')

 


* 속성값의 의미

속성

의미

scheme

URL에 사용된 프로토콜을 의미

netloc

네트워크의 위치, user:password@host:port 형식으로 표현되며, HTTP 프로토콜일 경우 host:port 형식으로 지정된다.

path

파일이나 애플리케이션 경로를 의미

params

애플리케이션에 전달될 매개변수

query

질의 문자열로 앰퍼샌드(&)로 구분된 = 쌍 형식으로 표현

fragment

문서내의 앵커 등 조각을 지정


2. urllib2 모듈


1) urlopen 함수

urllib2 모듈은 주어진 URL에서 데이터를 가져오는 기본 기능을 제공하며 urlopen() 함수의 형식은 아래와 같다.

* 참고로 이함수는 2.x버전 urllib.urlopen() 함수는 3.x버전에서는 제거되었고 urllib2.urlopen() 함수를 사용해야한다.


urlopen(url, data=None, [timeout])

 

* url에 file을 지정하면 로컬 파일을 열수도 있음

* 요청방식을 POST로 보내고 싶다면 data 인자에 질의 문자열을 지정해주면 된다.

* timeout은 응답을 기다리는 타임아웃 시간을 초로 표시


- 사용 예제 1

네이버 웹서버에 페이지를 읽어서 500 바이트 만큼 출력

from urllib2 import urlopen

f = urlopen("http://www.naver.com")

print f.read(500)

...

<!doctype html>

<html lang="ko">

<head>

 

- 사용 예제 2

POST 방식으로 요청(네이버에서는 post 방식에대한 처리가 없기때문에 그냥 그대로보임)

from urllib2 import urlopen

data = "query=python"

f = urlopen("http://www.naver.com")

print f.read(500)

<!doctype html>

<html lang="ko">

<head>

 

- 사용 예제 3

POST 방식 요청을 아래와같은 방식으로도 할수 있다.

 

import urllib2

req = urllib2.Request(“http://www.naver.com”)

req.add_header(“Content-Type”,”text/plain”)

req.add_data(“query=python”)  #POST method

f = urllib2.urlopen(req)

print f.read(300)

 

 

* 참고 내부링크

파이썬 웹표준 라이브러리 소개 및 변경사항

저작자 표시
신고
Posted by 캐스피
/* 
written by kaspy (kaspyx@gmail.com)
*/ 


파이썬은 버전에 따라 크게 2.x와 3.x로 나뉜다. 함수와 클래스등은 거의 동일하지만, 패키지명과 모듈명이 재구성 되었다고한다.


또한 웹 어플리케이션에 사용되는 라이브러리는 웹 클라이언트용 API와 웹서버 API로 나뉜다.



* 파이썬 3.x 와 2.x 표준 라이버리 모듈 구성 변경사항

(빨강색 음영은 클라이언트단, 파랑색 음영은 서버단임은 참고)


파이썬 3.x 모듈명

파이썬 2.x 모듈명

파이썬 3.x 에서의 변화

urllib.parse

urlparse

urllib 일부

 

하나의 urllib 패키지로 모아 모듈을 기능별로 나눔

urllib.request

urllib2 대부분

urllib 일부

urllib.error

urllib2 대부분

urllib 일부

urllib.response

 

urllib 일부

urllibrobotparse

robotparse

 

http.server

BaseHTTPServer

 

하나의 http 패키지로 모아서 server client 모듈로 구분

CGIHTTPServer

 

SimpleHTTPServer

 

httplib

 

http.coockies

Cookie

 

하나의 http 패키지 합병

http.cookiejar

cookielib

 

html.parser

HTMLParser

 

하나의 html 패키지로 합병

html.entities

htmlentitydefs

 


* 참고 자료 

Django로 배우는 쉽고 빠른 파이썬 웹 프로그래밍



저작자 표시
신고
Posted by 캐스피

 윈도우즈 환경에서 파이썬 애플리케이션 개발과 디버깅을 빠르게 수행하려면 IDE와 파이썬 인터프리터가 설치 되어야한다. 

이클립스(Eclipse)환경에서 설치가 됬다는 전제하에 설명 하겠다.

우선 이클립스를 다운받는다. 이클립스는 별도의 설치과정이 없고 압축을 풀어서 사용하기 때문에 굉장히 편한거같다.


이클립스 (Ecplise) 다운로드 사이트(http://www.eclipse.org/downloads/)

  http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops4/R-4.1.2-201202230900/eclipse-SDK-4.1.2-win32.zip 



다운로드가 완료되었으면 이클립스를실행시키자

Help 메뉴의 Install New Software를 클릭하자


Work with: 라는곳에 커서를 입력하고 http://pydev.org/updates 라고 입력하면 위와 같은 리스트들이 나올것이다.


PyDev에 체크를 한후 Next 버튼을 누르면 인스톨이 진행될 것이다.


진행이 완료되면 이클립스를 재실행하라고 할것이다.


이로써 파이썬설치가 완료됬고, 이클립스에서 파이썬을 컴파일할때 인터프리터 위치를 제대로 찾을수 있게 해야한다.


Window -> Preferences 메뉴를 선택하고 PyDev 트리 아이템을 펼쳐 Interpreter -> Python을 선택한다.


New 버튼을 눌러 파이썬이 설치된 폴더로 가서 Python.exe을 지정해준다.

파이썬은 보통 c:\ 드라이브에 설치되니 그것을 기준으로 찾으면된다.


그리곤 디폴트로 지정되어있는 체크항목으로 Next~~하면된다.


위의 그림은 설정이 완료된 모습이다.


이제는 파이썬 코딩을 하여 컴파일 실행을 해보자.


 File -> New -> Project 메류를 선택한다.


PyDev 폴더를 선택한수 Pydev Project 를 선택하고 Next를 클릭


Project Name은 자신이 하고싶은걸로 정하면 된다. 이름을 지정후 Finish 버튼 클릭하면 프로젝트가 디렉토리가 만들어진다.


해당 디렉토리에서 오른쪽 클릭후 


New->Pydev Module 을 위와 같이 선택해준다.


그러면 아래와 같이 Name을 지정해주고 Finish을 클릭해주면 된다.


그러면 이제 파이썬 코딩 창이 나오는데 간단한 코드를 실행해보자


  1. from ctypes import *
  2. msvcrt = cdll.msvcrt
  3. message_string = "Hello World!!!\n"
  4. msvcrt.printf("Testing: %s",message_string)


위와 같이 코딩후 Run -> Run As -> Python Run 을 클릭하거나

좌측 상단의 > 버튼을 누르면 결과가 출력된다.

 이로써 파이썬 개발환경을 구축하였다.


파이썬은 스크립트형 언어이기도해서 간단한 코드나, 여러가지 복잡한 계산울 제공하는 모듈이 있어서 보조적으로 공부해두면 많은 도움이 될것이다+_+

신고
Posted by 캐스피


티스토리 툴바