기본 콘텐츠로 건너뛰기

라벨이 REST인 게시물 표시

django REST API practice like a boss

pycharm 안녕. django project 생성. 실행환경은 virtualenv로 3.6.x virtualenv 생성에 약간 시간 소모. setting.py와 urls.py가 반겨줌 djex1 프로젝트를 만들었음 __init__.py settings.py urls.py wsgi.py 요렇게 생김. 자, 게임을 시작해볼까? option+R 누름. 이런 애가 나옴. startapp product 라고 쳐서 product 업무를 만들어보자. 자동완성이 된다. product 아래 admin.py apps.py models.py tests.py views.py 이런 파일들이 생겼다. rails 생각이 난다. 내용물은 텅텅 비어서 실망스럽다. comment라도 있을 줄 알았는데. 여튼 텍스트로 hello world 같은 건 안찍어본다. 바로 rest API http://www.django-rest-framework.org/tutorial/quickstart/ 돌입한다. pip install djangorestframework 뭔가 설치했으니 requirements.txt로 pip freeze하여 깡통인 곳에서 설치할때 pip install -r requirements.txt로 설치할 수 있게 만들자. pip freeze > requirements.txt REST API framework는 설치했고 DB를 만들자. 먼저 migrate을 돌려주자. option+R 상태에서 migrate 엔터 Running migrations:   Applying contenttypes.0001_initial... OK   Applying auth.0001_initial... OK   Applying admin.0001_initial... OK   Applying admin.0002_logentry_remove_auto_add... OK...

외부에서 REST로 Meteor 서버에 접근할 때 인증(Authentication) 팁 - Picker 사용

Meteor 서버와 외부 서버끼리 연동할 일이 간혹 있다. 혹은, 정적 웹페이지를 구축하고 REST로 Meteor 서버에 접근하고 싶을 수도 있을 것이다. 가령 /image 라는 경로에 POST로 그림 파일을 올리고자 하면 클라이언트 쪽에서 보내는 것은 문제가 아니지만 사용자를 어떻게 인증할 것인가에 대한 문제가 생긴다. 그렇다고 매번 POST를 보낼 때 마다 사용자 아이디와 패스워드를 올려서 검증하는 것도 번거로울 뿐만 아니라 보안상 좋지 않다. Meteor 의 경우 최초 사용자 인증이 끝나면 loginToken이라는 값을 반환하여 이 값으로 다음번에 인증을 할 수 있는데 이것은 사용자 계정 정보 curl -XPOST 'localhost:3000/image' -H "x-user-auth:< 지난번 로그인 때 저장한 loginToken >" -F "image=@/xxx/xxx/xxx/xxx.gif" 로 호출한다고 가정했을때 POST에 대한 filter 를 설정하고 API=   GET: Picker.filter (req, res)-> req.method is "GET"   POST: Picker.filter (req, res)-> req.method is "POST"   DELETE: Picker.filter (req, res)-> req.method is "DELETE" 서버 라우팅을 해준다. API.POST.route '/image', (params, req, res)->   token = req.headers['x-user-auth']   hashedToken = Accounts._hashLoginToken(token)   user = Meteor.users.findOne 'services.resume.loginTokens.hashedToken': ...

Meteor REST API 미립자 팁 - 404 처리하기

Meteor 를 쓰다보면 너무 편해서 그냥 단순 REST API 서버도 Meteor 로 만들고 싶을 때가 있다. WebApp package는 connect 객체를 갖고 있기 때문에 필요한 라우팅을 해준 뒤   WebApp.connectHandlers   .use('/hey', (req,res)=> res.end('hey handler'))   .use('/may', (req,res)=> res.end('may handler'))   .use( ( req,res ) => res.statusCode = 404 && res.end('404 not found')); 이와 같이 마지막에 모든 request에 대해 처리해주면 된다. 만일 Picker( https://github.com/meteorhacks/picker ) 같은 패키지를 사용할 경우 내부적으로 path-to-regexp npm package를 사용하므로 맞게 수정해줄 필요가 있다. Picker.route('/hey', (params,req,res)=> res.end('hey picker')); Picker.route('/(.*)', (params,req,res,next)=> res.statusCode = 404 && res.end('404 not found')); 역시 Meteor는 REST API 서버로만 써도 완전 꿀이다.

Meteor에서 REST API를 사용하는 방법 #2

server쪽 API를 router package를 사용해 쓰다보면 header 같은 걸 다루거나 할땐 너무 단순하게 만들어서 곤란할 수 있다. 이전에도 다룬 적( http://spectrumdig.blogspot.kr/2012/08/meteor-rest.html )이 있지만 __meteor_bootstrap__ 객체를 통해 접근하면 node.js 식의 접근이 가능하다. Meteor update와 함께 Npm 객체가 생겼으니 이를 이용해 connect 객체를 사용해보자 http://www.slideshare.net/cjoudrey/building-your-first-node-app-with-connect-express 위 슬라이드를 한번 보면 이해에 도움이 될 것이다. WebApp.connectHandlers 가 connect.createServer()라는 걸 기억하면 된다. connect = Npm.require 'connect' server = WebApp.connectHandlers server.use connect.router (app)-> app.get '/info', (req,res)-> res.end "info" app.get '/user/:id', (req,res)-> res.end "user id: #{req.params.id}" 이와 같은 코드를 server 디렉토리에 안에 넣거나 Meteor.isServer일때 실행하도록 하자. 파일 업로드나 쿼리 문자열 처리(ex: ?a=1&b=c)하려면 각각 bodyParser( http://www.senchalabs.org/connect/bodyParser.html ) 와 query( http://www.senchalabs.org/connect/query.html )를 추가하는 것이 좋다. 위의 해당 링크에 보면 소스까지 공개 해놓아서 이해하기 쉬우니 ...

Meteor 에서 REST 사용

Meteor 에서 file-upload 라던가 REST API 같은 걸 제공하려면 request 를 받아서 처리할 수 있어야하는데 Meteor 에선 지원하지 않아 좀 답답한 면이 있다. 하지만 그래봤자. Node.js 고 connect 프레임워크를 사용하고 있기 때문에 저번에 언급한 적이 있던 __meteor_bootstrap__ 를 이용해보자. ./.meteor/local/build/server/server.js 를 보면 서버쪽 구동부를 볼 수 있는데 run function 쪽을 보면   __meteor_bootstrap__ = {require: require, startup_hooks: [], app: app}; 이런 코드가 있다. 여기서 app은? 그 위쪽에    var app = connect.createServer(); 어이쿠 connect 네. 게임 끝나셨다. 서버쪽에 아래와 같이 stack array 에 route 를 추가하면 된다. Meteor.startup ->   app=__meteor_bootstrap__.app   app.stack.unshift     route: "/api",     handle: (req,res)->       res.statusCode = 200       res.write "OK"       res.end() 다행이야 다행이군!