You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.5 KiB
Python
96 lines
3.5 KiB
Python
from __future__ import print_function
|
|
from __future__ import unicode_literals
|
|
|
|
from builtins import str, bytes, dict, int
|
|
|
|
import os
|
|
import sys
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", ".."))
|
|
|
|
from pattern.server import App
|
|
from pattern.server import MINUTE, HOUR, DAY
|
|
|
|
from pattern.text import language
|
|
|
|
app = App("api")
|
|
|
|
# The language() function in pattern.text guesses the language of a given string.
|
|
# For example: language("In French, goodbye is au revoir.") returns ("en", 0.83).
|
|
# It can handle "en", "es", "de", "fr", "nl", "it" with reasonable accuracy.
|
|
|
|
# To create a web service like Google Translate with pattern.server is easy.
|
|
# Normally, URL handlers return a string with the contents of that web page.
|
|
# If we return a dictionary instead, it will be formatted as a JSON-string,
|
|
# the data interchange format used by many popular web services.
|
|
|
|
# So clients (e.g., a user's Python script) can query the web service URL
|
|
# and catch the JSON reply.
|
|
|
|
# There is only one tricky part: rate limiting.
|
|
# Note the "limit", "time" and "key" parameters in @app.route() below.
|
|
# We'll explain them in more detail.
|
|
|
|
# First, run the script and visit:
|
|
# http://127.0.0.1:8080/language?q=in+french+goodbye+is+au+revoir
|
|
|
|
# You should see some JSON-output:
|
|
# {"language": "en", "confidence": 0.83}
|
|
|
|
|
|
@app.route("/language", limit=100, time=HOUR)
|
|
def predict_language(q=""):
|
|
#print(q)
|
|
iso, confidence = language(q) # (takes some time to load the first time)
|
|
return {
|
|
"language": iso,
|
|
"confidence": round(confidence, 2)
|
|
}
|
|
|
|
# When you set up a web service, expect high traffic peaks.
|
|
# For example, a user may have 10,000 sentences
|
|
# and send them all at once in a for-loop to our web service:
|
|
|
|
# import urrlib
|
|
# import json
|
|
# for s in sentences[:10000]:
|
|
# url = "http://127.0.0.1:8080/language?q=" + s.replace(" ", "-")
|
|
# data = urllib.urlopen(url).read()
|
|
# data = json.loads(data)
|
|
|
|
# Rate limiting caps the number of allowed requests for a user.
|
|
# In this example, limit=100 and time=HOUR means up to a 100 requests/hour.
|
|
# After that, the user will get a HTTP 429 Too Many Requests error.
|
|
|
|
# The example below demonstrates how rates can be set up per user.
|
|
# In this case, only the user with key=1234 is allowed access.
|
|
# All other requests will generate a HTTP 403 Forbidden error.
|
|
# A user can pass his personal key as a query parameter, e.g.,
|
|
# http://127.0.0.1:8080/language/paid?q=hello&key=1234
|
|
|
|
# Check personal keys instead of IP-address:
|
|
|
|
|
|
@app.route("/language/paid", limit=True, key=lambda data: data.get("key"))
|
|
def predict_language_paid(q="", key=None):
|
|
return {"language": language(q)[0]}
|
|
|
|
# Create an account for user with key=1234 (do once).
|
|
# You can generate fairly safe keys with app.rate.key().
|
|
if not app.rate.get(key="1234", path="/language/paid"):
|
|
app.rate.set(key="1234", path="/language/paid", limit=10000, time=DAY)
|
|
|
|
# Try it out with the key and without the key:
|
|
# http://127.0.0.1:8080/language/paid?q=hello&key=1234
|
|
# http://127.0.0.1:8080/language/paid?q=hello (403 error)
|
|
|
|
# A rate.db SQLite database was created in the current folder.
|
|
# If you want to give it another name, use App(rate="xxx.db").
|
|
# To view the contents of the database,we use the free
|
|
# SQLite Database Browser (http://sqlitebrowser.sourceforge.net).
|
|
|
|
# If the web service is heavily used,
|
|
# we may want to use more threads for concurrent requests
|
|
# (default is 30 threads with max 20 queueing):
|
|
|
|
app.run("127.0.0.1", port=8080, threads=100, queue=50)
|