#THIS IS A WEBSERVER FOR DEMONSTRATING THE TYPES OF RESPONSES WE SEE FROM AN API ENDPOINT
from flask import Flask
app = Flask(__name__)
#GET REQUEST
@app.route('/readHello')
def getRequestHello():
return "Hi, I got your GET Request!"
#POST REQUEST
@app.route('/createHello', methods = ['POST'])
def postRequestHello():
return "I see you sent a POST message :-)"
#UPDATE REQUEST
@app.route('/updateHello', methods = ['PUT'])
def updateRequestHello():
return "Sending Hello on an PUT request!"
#DELETE REQUEST
@app.route('/deleteHello', methods = ['DELETE'])
def deleteRequestHello():
return "Deleting your hard drive.....haha just kidding! I received a DELETE request!"
if __name__ == '__main__':
app.debug = True
app.run(host='0.0.0.0', port=5000)
Category: Python
parsing
>>> import urllib2
>>> import urllib
>>> p = urllib2.urlopen("http://www.google.com")
>>> p
>
>>> c = p.read()
>>> dir(p)
['__doc__', '__init__', '__iter__', '__module__', '__repr__', 'close', 'code', 'fileno', 'fp', 'getcode', 'geturl', 'headers', 'info', 'msg', 'next', 'read', 'readline', 'readlines', 'url']
>>> p.url
'http://www.google.co.jp/?gfe_rd=cr&ei=MtZkWNDXDYSL8QeD46cY'
>>> p.headers
>>> p.headers.items()
[('x-xss-protection', '1; mode=block'), ('set-cookie', 'NID=93=O65u9flBWzM92U9MzcezfIXaeG9itO-ala3ogt6T7fipovY5ily4QBNUxbUbsVga_hYeJEKWDq891mFaPgZm2Ya_1gvUZm37K2pNfFpOUVxCptVtOSAn3OXvUHCzKBaC; expires=Fri, 30-Jun-2017 09:24:02 GMT; path=/; domain=.google.co.jp; HttpOnly'), ('accept-ranges', 'none'), ('expires', '-1'), ('vary', 'Accept-Encoding'), ('server', 'gws'), ('connection', 'close'), ('cache-control', 'private, max-age=0'), ('date', 'Thu, 29 Dec 2016 09:24:02 GMT'), ('p3p', 'CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."'), ('content-type', 'text/html; charset=Shift_JIS'), ('x-frame-options', 'SAMEORIGIN')]
>>> p.headers['content-type']
'text/html; charset=Shift_JIS'
>>> s = = urllib2.urlopen("http://www.example.com")
SyntaxError: invalid syntax
>>> s = urllib2.urlopen("http://www.example.com")
>>> s.url
'http://www.example.com'
>>> s.headers.items()
[('content-length', '1270'), ('x-ec-custom-error', '1'), ('x-cache', 'HIT'), ('expires', 'Thu, 05 Jan 2017 09:28:12 GMT'), ('vary', 'Accept-Encoding'), ('server', 'ECS (rhv/818F)'), ('last-modified', 'Fri, 09 Aug 2013 23:54:35 GMT'), ('connection', 'close'), ('etag', '"359670651+gzip+ident"'), ('cache-control', 'max-age=604800'), ('date', 'Thu, 29 Dec 2016 09:28:12 GMT'), ('content-type', 'text/html')]
parsing xml
from xml.com import minidom
json
>>> import json
>>> j = '{"one": 1, "numbers": [1,2,3.5]}'
>>> json.loads(j)
{u'numbers': [1, 2, 3.5], u'one': 1}
def total_ups():
j = json.loads(reddit_front)
sum(c['data']['ups'] for c in j['data']['children'])
host ip info
host ip info
IP_URL = "http://api.hostip.info/?ip="
def get_coords(ip):
url = IP_URL + ip
content = None
content = urllib2.urlopen(url).read()
except URLError:
return
if content:
d = minidom.parseString(content)
coords = d.getElementByTagName("gml:coordinates")
if coords and coords[0].childNodes[0].nodeValue:
lon, lat = coords[0].childNodes[0].nodeValue.split(',')
return db.GetPt(lat, lon)
Gmap
GMAPS_URL = ""
def gmap_img(points):
markers = '&'.join('makers=%s,%s' % (p.lat, p.lon)
for p in points)
return GMAPS_URL + markers
print gmaps_img([Point])
Querying
from collections import namedtuple
# make a basic Link class
Link = namedtuple('Link', ['id', 'submitter_id', 'submitted_time', 'votes',
'title', 'url'])
# list of Links to work with
links = [
Link(0, 60398, 1334014208.0, 109,
"C overtakes Java as the No. 1 programming language in the TIOBE index.",
"http://pixelstech.net/article/index.php?id=1333969280"),
Link(1, 60254, 1333962645.0, 891,
"This explains why technical books are all ridiculously thick and overpriced",
"http://prog21.dadgum.com/65.html"),
Link(23, 62945, 1333894106.0, 351,
"Learn Haskell Fast and Hard",
"http://yannesposito.com/Scratch/en/blog/Haskell-the-Hard-Way/"),
Link(2, 6084, 1333996166.0, 81,
"Announcing Yesod 1.0- a robust, developer friendly, high performance web framework for Haskell",
"http://www.yesodweb.com/blog/2012/04/announcing-yesod-1-0"),
Link(3, 30305, 1333968061.0, 270,
"TIL about the Lisp Curse",
"http://www.winestockwebdesign.com/Essays/Lisp_Curse.html"),
Link(4, 59008, 1334016506.0, 19,
"The Downfall of Imperative Programming. Functional Programming and the Multicore Revolution",
"http://fpcomplete.com/the-downfall-of-imperative-programming/"),
Link(5, 8712, 1333993676.0, 26,
"Open Source - Twitter Stock Market Game - ",
"http://www.twitstreet.com/"),
Link(6, 48626, 1333975127.0, 63,
"First look: Qt 5 makes JavaScript a first-class citizen for app development",
"http://arstechnica.com/business/news/2012/04/an-in-depth-look-at-qt-5-making-javascript-a-first-class-citizen-for-native-cross-platform-developme.ars"),
Link(7, 30172, 1334017294.0, 5,
"Benchmark of Dictionary Structures", "http://lh3lh3.users.sourceforge.net/udb.shtml"),
Link(8, 678, 1334014446.0, 7,
"If It's Not on Prod, It Doesn't Count: The Value of Frequent Releases",
"http://bits.shutterstock.com/?p=165"),
Link(9, 29168, 1334006443.0, 18,
"Language proposal: dave",
"http://davelang.github.com/"),
Link(17, 48626, 1334020271.0, 1,
"LispNYC and EmacsNYC meetup Tuesday Night: Large Scale Development with Elisp ",
"http://www.meetup.com/LispNYC/events/47373722/"),
Link(101, 62443, 1334018620.0, 4,
"research!rsc: Zip Files All The Way Down",
"http://research.swtch.com/zip"),
Link(12, 10262, 1334018169.0, 5,
"The Tyranny of the Diff",
"http://michaelfeathers.typepad.com/michael_feathers_blog/2012/04/the-tyranny-of-the-diff.html"),
Link(13, 20831, 1333996529.0, 14,
"Understanding NIO.2 File Channels in Java 7",
"http://java.dzone.com/articles/understanding-nio2-file"),
Link(15, 62443, 1333900877.0, 1244,
"Why vector icons don't work",
"http://www.pushing-pixels.org/2011/11/04/about-those-vector-icons.html"),
Link(14, 30650, 1334013659.0, 3,
"Python - Getting Data Into Graphite - Code Examples",
"http://coreygoldberg.blogspot.com/2012/04/python-getting-data-into-graphite-code.html"),
Link(16, 15330, 1333985877.0, 9,
"Mozilla: The Web as the Platform and The Kilimanjaro Event",
"https://groups.google.com/forum/?fromgroups#!topic/mozilla.dev.planning/Y9v46wFeejA"),
Link(18, 62443, 1333939389.0, 104,
"github is making me feel stupid(er)",
"http://www.serpentine.com/blog/2012/04/08/github-is-making-me-feel-stupider/"),
Link(19, 6937, 1333949857.0, 39,
"BitC Retrospective: The Issues with Type Classes",
"http://www.bitc-lang.org/pipermail/bitc-dev/2012-April/003315.html"),
Link(20, 51067, 1333974585.0, 14,
"Object Oriented C: Class-like Structures",
"http://cecilsunkure.blogspot.com/2012/04/object-oriented-c-class-like-structures.html"),
Link(10, 23944, 1333943632.0, 188,
"The LOVE game framework version 0.8.0 has been released - with GLSL shader support!",
"https://love2d.org/forums/viewtopic.php?f=3&t=8750"),
Link(22, 39191, 1334005674.0, 11,
"An open letter to language designers: Please kill your sacred cows. (megarant)",
"http://joshondesign.com/2012/03/09/open-letter-language-designers"),
Link(21, 3777, 1333996565.0, 2,
"Developers guide to Garage48 hackatron",
"http://martingryner.com/developers-guide-to-garage48-hackatron/"),
Link(24, 48626, 1333934004.0, 17,
"An R programmer looks at Julia",
"http://www.r-bloggers.com/an-r-programmer-looks-at-julia/")]
# links is a list of Link objects. Links have a handful of properties. For
# example, a Link's number of votes can be accessed by link.votes if "link" is a
# Link.
# make the function query() return the number of votes for the link whose ID is
# 15
def query():
submissions = []
for l in links:
if submitter_id = 62443:
submissions.append(l)
submissions.sort(key = lambda x: x.submitted_time)
return submissions
print query()
template
import os
import webapp2
form_html = """
<form>
<h2>Add a Food</h2>
<input type="text" name="food">
%s
<button>Add</button>
</form>
"""
hidden_html = """
<input type="hidden" name="food" value="%s">
"""
shopping_list_html = """
<br>
<br>
<h2>Shopping List</h2>
<ul>
%s
</ul>
"""
class Handler(webapp2.RequestHandler):
def write(self, *a, **kw):
self.response.out.write(*a, **kw)
class MainPage(Handler):
def get(self):
output = form_html
hidden_html = ""
items = self.request.get_all("food")
if items:
output_items = ""
for item in items:
output_hidden += hidden_html % item
output_items += item_html % item
output_shopping = shopping_list_html % output_items
output += output_shopping
output = output % output_hidden
self.write(output)
app = webapp2.WSGIApplication([('/', MainPage),
],
debug=True)
application:template-lesson
version: 1
runtime: python27
api_version: 1
threadsafe: True
handlers:
- url: /.*
script: templates.app
python template
<!DOCTYPE html>
<html>
<head>
<title>templates!</title>
</head>
<body style="margin: 0">
<h1 style="background-color: #ddd: color: #888; margin: 0, height: 50px">
Templates
</h1>
{% block content %}
{% endblock %}
</body>
</html>
{% extends "base.html" %}
{% block content %}
<form>
<h2>Add a Food</h2>
<input type="text" name="food">
{% if items %}
{% for item in items %}
<input type="hidden" name="food" value="{{item}}">
{% endfor %}
<button>Add</button>
{% if items %}
<br>
<br>
<h2>Shopping List</h2>
<ul>
{% for item in items %}
<li>{{ item | escape }}</li>
</ul>
{% endif %}
</form>
{% endblock %}
rot13
if ‘A’ <= c and c <= 'Z': return chr((ord(c) - ord('A') + 13) % 26 + ord('A')) if 'a' <= c and c <= 'Z': return chr((ord(c) - ord('a') + 13) % 26 + ord('a')) return c
def render_str(template, **params):
t = jinja_env.get_template(template)
return t.render(params)
class BaseHandler(webapp2.RequestHandler):
def render(self, template, **kw):
self.response.out.write(render_str(template, **kw))
def write(self, *a, **kw):
self.response.out.write(*a, **kw)
class Rot13(BaseHandler):
def get(self):
self.render('rot13-form.html')
def post(self)
rot13 = ''
text = self.request.get('text')
if text:
rot13 = text.encode('rot13')
self.render('rot13-form.html', text = rot13)
USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$")
def valid_username(username):
return username and USER_RE.match(username)
PASS_RE = re.compile(r"^.{3,20}$")
def valid_password(password):
python %s
replaced by given string.
given_string = "I think %s is a perfectly normal thing to do in public."
def sub1(s):
return given_string % s
given_string2 = "I think %s and %s are perfectly normal things to do in public."
def sub2(s1, s2):
return given_string2 % (s1, s2)
string substitution
given_string2 = "I'm %(nickname)s. My real name is %(name)s, but my friends call me %(nickname)s."
def sub_m(name, nickname):
return given_string2 % {"nickname": nickname, "name" : name}
print sub_m("Mike", "Goose")
replacement
def escape_html(s):
for (i, o) in (("&", "&"),
(">", ">"),
("<", "<"),
('"', ""e;")):
s = s.replace(i, o)
return s
print escape_html('>')
import cgi
def escape_html(s):
return cgi.escape(s, quote = True)
print escape_html('"hello, & = &"')
validation
str.capitalize(): returns a copy of the string with only its first character capitalized.
months = ['January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December']
def valid_month(month):
if month:
cap_month = month.capitalize()
if cap_month in months:
return cap_month
use dictionary to restrict only three character.
month_abbvs = dic((m[:3].lower(), m) for m in months)
def valid_month(month):
if month:
short_month = month[:3].lower()
return month_abbvs.get(short_month)
checking day
def valid_day(day):
if day and day.isdigit():
day = int(day)
if day > 0 and <= 31:
return day
telnet
[vagrant@localhost]$ sudo yum -y install telnet Trying 35.160.185.106... Connected to www.udacity.com. Escape character is '^]'. GET / HTTP/1.0 Host: www.example.com HTTP/1.1 302 Found Cache-Control: no-cache Location: https://www.example.com/ Content-Length: 0 Connection: Close
input form
<form action="http://www.google.com/search"> <input name="q"> <input type="submit"> </form>
play.py
import webapp2
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, webapp World!')
app = webapp2.WSGIApplication([('/', MainPage)],
debug=True)
ダブルクォーテーション3つでくくると、複数行に渡る文字列を記述することができる。
import webapp2
form="""
<form action="http://www.google.com/search">
<input name="q">
<input type="submit">
</form>
"""
class MainPage(webapp2.RequestHandler):
def get(self):
#self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, webapp World!')
app = webapp2.WSGIApplication([('/', MainPage)],
debug=True)
form parameter
<form> <input type="radio" name="q" value="one"> <input type="radio" name="q" value="two"> <input type="radio" name="q" value="third"> <br> <input type="submit"> </form>
<form>
<label>
one
<input typ\e="radio" name="q" value="one">
</label>
<label>
two
<input type="radio" name="q" value="two">
</label>
<label>
three
<input type="radio" name="q" value="third">
</label>
<br>
<input type="submit">
</form>
select
<form>
<select name="q">
<option value="1">the number one</option>
<option>two</option>
<option>three</option>
</select>
<br>
<input type="submit">
</form>
User validation
import webapp2
form="""
<form method="post">
What is your birthday?
<br>
<label>Month
<input type="text" name="month">
</label>
<label>Day
<input type="text" name="day">
</label>
<label>Year
<input type="text" name="year">
</label>
<br>
<br>
<input type="submit">
</form>
"""
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.out.write(form)
def post(self):
self.response.out.write("Thanks! That's a totally valid day!")
app = webapp2.WSGIApplication([('/', MainPage),('/testform', TestHandler)],
debug=True)
Run python server
shell command
python -m http.server 8000
write with canvas
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<canvas id="c" width="500" height="500"></canvas>
<script>
var c = document.querySelector("#c");
var ctx = c.getContext("2d");
ctx.fillRect(100, 100, 100, 100);
ctx.strokeRect(50, 50, 50, 50);
</script>
</body>
</head>
</html>
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
class WebServerHandler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path.endswith("/hello"):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
message = ""
message += "<html><body>Hello!</body></html>"
self.wfile.write(message)
print message
return
if self.path.endswith("/hola"):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
message = ""
message += "<html><body> ¡ Hola ! <a href='/hello'>back to hello</a></body></html>"
self.wfile.write(message)
print message
return
else:
self.send_error(404, 'File Not Found: %s' % self.path)
def main():
try:
port = 8080
server = HTTPServer(('', port), WebServerHandler)
print "Web Server running on port %s" % port
server.serve_forever()
except KeyboardInterrupt:
print " ^C entered, stopping web server...."
server.socket.close()
if __name__ == '__main__':
main()
from flask import Flask
app = Flask(__name__)
@app.route('/')
@app.route('/hello')
def HelloWorld():
return "Hello World"
if __name__ == '__main__':
app.debug = True
app.run(host='0.0.0.0', port=5000)
create own webserver
from http.server import BaseHTTPRequestHandler, HTTPServer
class webserverHandler(BaseHTTPRequestHandler):
def do_GET(self):
try:
if self.path.endswith("/hello"):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
output = ""
output += "<html><body>Hello!</body></html>"
self.wfile.write(output)
print(output)
return
except IOError:
self.send_error(404, "File Not Found %s" % self.path)
def main():
try:
port = 8080
server = HTTPServer(('',port), webserverHandler)
print("Web server running on port %s" % port)
server.serve_forever()
except keyboardInterrupt:
print("^C entered, stopping web server...")
server.socket.close()
if __name__ == '__main__':
main()