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

평소에 친한 개발자 친구가 항상  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/

ViewPager를 처음 본 후 코드량과 아웃풋에 반해서 가지고 있던 앱들의 메인 네비게이션을 모두 Viewpager로 변경을 했는데, 크고 작은 문제들이 계속 나오고 있다.


그 중에서 오늘 발견한 문제는 Fragment 안에 있는 getAcitivity()가 null이 되면서 null exception error를 뱉고 죽는 현상이었다.


Fragment 안에서 아래와 같이 토스트 메시지를 뛰우고 인텐트를 통해 다른 페이지로 이동하는 코드에서 발생했는데 처음보는 현상이라 원인이 Viewpager일거라고 상상도 못했다. 

Toast.makeText(getActivity(), "메시지", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(getActivity(), PhoneNumCheckActivity.class);
startActivity(intent);

getActivity().finish();

구글을 뒤적뒤적하다보니 Fragment가 전환되는 과정에서 activity가 detach 된 것 같다는 의견이 다수였던 것 같다.


Fragment생명주기 상 OnAttach()에서 activity를 연결하는 과정을 통하면 해결된다는 것 같았다. 그런데 어떻게????


아래와 같이 하라는데.....뭘 어떻게 하라는 건지 몰라 살짝 패닉이 왔다.



출처: 

- https://codedump.io/share/ffbRcoGlaWq/1/getactivity-returns-null-in-fragment-function 

- http://stackoverflow.com/questions/6215239/getactivity-returns-null-in-fragment-function

onAttach(Activity activity)


그래서 다시 "viewpager getactivity null"이란 키워드로 집중적으로 찾다보니 아래 페이지를 찾게 됐다.

http://stackoverflow.com/questions/38891906/why-does-getactivity-returns-null-in-fragment-in-viewpager


정확하게 내가 가진 문제를 해결하는 방법은 아니었지만 그래도 코드 중에 힌트가 많이 있어 해결하는데 도움이 많이 됐다.

private Activity activity;


@Override
public void onAttach(Context context) {
super.onAttach(context);

if (context instanceof Activity) {
activity = (Activity) context;
}

}

위에서 볼 수 있는 것처럼 일단 onAttach()에서 activity를 context와 연결해주고, 연결된 acitivity를 아래와 같이 getActivity()처럼 활용하면 잘 작동한다.

Toast.makeText(activity, "전화번호 인증이 되지 않았습니다. 인증페이지로 이동합니다", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(activity, PhoneNumCheckActivity.class);
activity.startActivity(intent);

activity.finish();

제대로 된 해결책인지는 모르지만 암튼 잘된다.

특정 사이트를 긁어오는데 유용한  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


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

+ Recent posts