Python for AngularJS

jmschenck 19,737 views 15 slides Feb 12, 2014
Slide 1
Slide 1 of 15
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15

About This Presentation

Presentation slides for a talk given at SF Python Meetup, 2014-02-12.

JavaScript frameworks are a really exciting tool for building super slick one-page apps. However, if you want them to play nice with a Python backend web framework (Django, Pyramid, Flask, etc.) you're going to have to flip ...


Slide Content

Python for AngularJS
AngularJS.$inject(Python)

Huh? Angular?
•JavaScript framework for SPAs
•“Extends” HTML vocabulary
•Controllers, services, templates

Let’s begin
<html ng-app="app">
<head>
<script src=“https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.js" >
</script>
<script>
!
angular.module( 'app', [])
.controller('TradeCtrl', function ($scope) {
$scope.conversion = 0.00000268;
});
!
</script>
</head>
<body ng-controller="TradeCtrl">
!
<input type="text" ng-model="bitcoins" placeholder="Bitcoins">
<p>Wow! {{ bitcoins }} BTC = {{ (bitcoins / conversion)|number }} DOGE! </p>
!
</body>
</html>

But wait! Data!
•Write a service in Angular

But wait! Data!
angular.module('app', [])
!
.factory('Exchange', function ($http) {
return {
getConversion: function () {
return $http.get('http://suchdoge.com/api/exchange/' );
}
}
})
!
.controller('TradeCtrl', function ($scope, Exchange) {
Exchange.getConversion().then( function (result) {
$scope.conversion = result.conversion;
});
});

But wait! Data!
•Write a service in Angular
•Write an API endpoint in Python

But wait! Data!
import json
from django.http import HttpResponse
from doge.models import DogeConversion
!
def exchange(request):
"""API endpoint for requesting current BTC-DOGE exchange rate."""
conversion = DogeConversion.objects. latest('timestamp')
response = {'conversion': conversion.rate}
return HttpResponse(
json.dumps(response),
content_type= 'application/json'
)

But wait! Data!
•Write a service in Angular
•Write an API endpoint in Python
•Ew, hard-coded URLs? Fix!

But wait! Data!
angular.module('app', [])
!
.config(function (RestangularProvider) {
RestangularProvider.setBaseUrl( '/api');
})
!
.factory('Exchange', function (Restangular) {
return {
getConversion: function () {
return Restangular.all('exchange');
}
};
})

But wait! Data!
•Write a service in Angular
•Write an API endpoint in Python
•Ew, hard-coded URLs? Fix!
•Ew, hand-written API views? Fix!

But wait! Data!
from rest_framework import viewsets
from doge.models import DogeConversion
!
class DogeConversionViewSet (viewsets.ModelViewSet):
model = DogeConversion

Gotchas
•Django and Jinja templates clash
.config(function ($interpolateProvider) {
$interpolateProvider. startSymbol('[[');
$interpolateProvider. endSymbol(']]');
})

Gotchas
•Django and Jinja templates clash
•CSRF tokens
.config(function ($httpProvider) {
var csrfToken = getCsrfToken(); // Implementation-dependent
$httpProvider.defaults.headers.common[ 'X-CSRFToken'] = csrfToken;
})

Gotchas
•Django and Jinja templates clash
•CSRF tokens
•Template partials

Jeff Schenck
CTO & Co-Founder
!
www.chewse.com
@jeffschenck
!
code github.com/jeffschenck/talk-2014-02-python-angularjs