CHAPTER
EIGHTEEN
PATTERNS FOR FLASK
Certain things are common enough that the chances are high you will find them in
most web applications. For example quite a lot of applications are using relational
databases and user authentication. In that case, chances are they will open a database
connection at the beginning of the request and get the information of the currently
logged in user. At the end of the request, the database connection is closed again.
There are more user contributed snippets and patterns in theFlaskSnippetArchives.
18.1 Larger Applications
For larger applications it’s a good idea to use a package instead of a module. That is
quite simple. Imagine a small application looks like this:
/yourapplication
/yourapplication.py
/static
/style.css
/templates
layout.html
index.html
login.html
...
18.1.1 Simple Packages
To convertthatinto a largerone, just create a newfolder yourapplication inside the exist-
ing one and move everything below it. Then rename yourapplication.py to __init__.py.
(Make sure to delete all .pyc files first, otherwise things would most likely break)
You should then end up with something like that:
/yourapplication
/yourapplication
/__init__.py
/static
101
Pdf data extraction to excel - extract form data from PDF in C#.net, ASP.NET, MVC, Ajax, WPF
Help to Read and Extract Field Data from PDF with a Convenient C# Solution
pdf data extractor; extract data from pdf file
Pdf data extraction to excel - VB.NET PDF Form Data Read library: extract form data from PDF in vb.net, ASP.NET, MVC, Ajax, WPF
Convenient VB.NET Solution to Read and Extract Field Data from PDF
extract data out of pdf file; pdf form save in reader
/style.css
/templates
layout.html
index.html
login.html
...
But how
do you
run your application now?
The naive python
yourapplication/__init__.py will not work. Let’s just say that Python does
not want modules in packages to be the startup file. But that is not a big problem,
just add a new file called runserver.py next to the inner yourapplication folder with the
following contents:
from yourapplication import app
app.run(debug=True)
Whatdid we gainfromthis? Nowwecan restructure the applicationa bitinto multiple
modules. The only thing you have to remember is the following quick checklist:
1. the Flask application object creation has to be in the __init__.py file. That way
each module can import it safely and the __name__ variable will resolve to the
correct package.
2. all the view functions (the ones with a route() decorator on top) have to be
imported in the __init__.py file. Not the object itself, but the module it is in.
Import the view module after the application object is created.
Here’s an example __init__.py:
from flask import Flask
app = Flask(__name__)
import yourapplication.views
And this is what views.py would look like:
from yourapplication import app
@app.route(/)
def index():
return Hello World!
You should then end up with something like that:
/yourapplication
/runserver.py
/yourapplication
/__init__.py
/views.py
/static
/style.css
/templates
layout.html
102
VB.NET PDF Text Extract Library: extract text content from PDF
Application. Advanced Visual Studio .NET PDF text extraction control, built in .NET framework 2.0 and compatible with Windows system.
extract data from pdf into excel; extract data from pdf to excel
C# PDF Text Extract Library: extract text content from PDF file in
Image text extraction control provides text extraction from PDF images and image files. Best C#.NET PDF text extraction library and component for free download.
how to fill out a pdf form with reader; export pdf form data to excel spreadsheet
index.html
login.html
...
Circular Imports
Every Python programmer hates them, and yet we just added some: circular imports
(That’s when two modules depend on each other. In this case views.py depends on
__init__.py). Be advised that this is a bad idea in general but here it is actually fine.
The reason for this is that we are not actually using the views in __init__.py and just
ensuring the module is imported and we are doing that at the bottom of the file.
There are still some problems with that approach but if you want to use decorators
there is no way around that. Check out the Becoming Big section for some inspiration
how to deal with that.
18.1.2 Working with Blueprints
If you have larger applications it’s recommended to divide them into smaller groups
where each group is implemented with the help of a blueprint. For a gentle intro-
duction into this topic refer to the Modular Applications with Blueprints chapter of the
documentation.
18.2 Application Factories
If you are already using packages and blueprints for your application (Modular Appli-
cations with Blueprints) there are a couple of really nice ways to further improve the
experience. A common pattern is creating the application object when the blueprint
is imported. But if you move the creation of this object, into a function, you can then
create multiple instances of this and later.
So why would you want to do this?
1. Testing. You can have instances of the application with different settings to test
every case.
2. Multiple instances. Imagine you want to run different versions of the same ap-
plication. Of course you could have multiple instances with different configs set
up in your webserver, but if you use factories, you can have multiple instances
of the same application running in the same application process which can be
handy.
So how would you then actually implement that?
103
VB.NET PDF Image Extract Library: Select, copy, paste PDF images
Support PDF Image Extraction from a Page, a Region on a Page, and PDF Document in VB.NET Project. DLLs for PDF Image Extraction in VB.NET.
extract data from pdf table; cannot save pdf form in reader
VB.NET PDF Page Extract Library: copy, paste, cut PDF pages in vb.
VB.NET PDF - PDF File Pages Extraction Guide. Detailed VB.NET Guide for Extracting Pages from Microsoft PDF Doc. Free PDF document
how to type into a pdf form in reader; export pdf data to excel
18.2.1 Basic Factories
The idea is to set up the application in a function. Like this:
def create_app(config_filename):
app = Flask(__name__)
app.config.from_pyfile(config_filename)
from yourapplication.model import db
db.init_app(app)
from yourapplication.views.admin import admin
from yourapplication.views.frontend import frontend
app.register_blueprint(admin)
app.register_blueprint(frontend)
return app
The downside is that you cannot use the application object in the blueprints at import
time. You can however use it from within a request. How do you get access to the
application with the config? Use current_app:
from flask import current_app, Blueprint, render_template
admin = Blueprint(admin, __name__, url_prefix=/admin)
@admin.route(/)
def index():
return render_template(current_app.config[INDEX_TEMPLATE])
Here we look up the name of a template in the config.
Extension objects are not initially bound to an application. Using db.init_app, the
app gets configured for the extension. No application-specific state is stored on the
extension object, so one extension object can be used for multiple apps. For more
information about the design of extensions refer to Flask Extension Development.
Your model.py might look like this when usingFlask-SQLAlchemy:
from flask.ext.sqlalchemy import SQLAlchemy
# no app object passed! Instead we use use db.init_app in the factory.
db = SQLAlchemy()
# create some models
18.2.2 Using Applications
So to use such an application you then have to create the application first. Here an
example run.py file that runs such an application:
104
C# PDF Image Extract Library: Select, copy, paste PDF images in C#
Document. Support PDF Image Extraction from a Page, a Region on a Page, and PDF Document. C# Project: DLLs for PDF Image Extraction. In
save data in pdf form reader; extract pdf form data to xml
VB.NET PDF Library SDK to view, edit, convert, process PDF file
PDF Text Extraction. Mature and robust APIs are provided for programmers to integrate and perform PDF text extraction feature in .NET windows and web project.
pdf data extraction to excel; extract data from pdf form fields
from yourapplication import create_app
app = create_app(/path/to/config.cfg)
app.run()
18.2.3 Factory Improvements
The factory function from above is not very clever so far, you can improve it. The
following changes are straightforward and possible:
1. make it possible to pass in configuration values for unittests so that you don’t
have to create config files on the filesystem
2. call a function from a blueprint when the application is setting up so that you
have a place to modify attributes of the application (like hooking in before /
after request handlers etc.)
3. Add in WSGI middlewares when the application is creating if necessary.
18.3 Application Dispatching
Application dispatching is the process of combining multiple Flask applications on
the WSGI level. You can not only combine Flask applications into something larger
but any WSGI application. This would even allow you to run a Django and a Flask
application in the same interpreter side by side if you want. The usefulness of this
depends on how the applications work internally.
The fundamental difference from the module approach is that in this case you are run-
ning the same or different Flask applications thatare entirely isolated from each other.
They run different configurations and are dispatched on the WSGI level.
18.3.1 Working with this Document
Each of the techniques and examples below results in an application object that
can be run with any WSGI server. For production, see Deployment Options. For
development, Werkzeug provides a builtin server for development available at
werkzeug.serving.run_simple():
from werkzeug.serving import run_simple
run_simple(localhost5000, application, use_reloader=True)
Note thatrun_simple is not intended for use in production. Use a full-blown WSGI
server.
In order to use the interactive debuggger, debugging must be enabled both on the
application and the simple server, here is the “hello world” example with debugging
andrun_simple:
105
C#: Demos and Sample Codes for Image Content Extraction Using OCR
C# Sample Code for Png Image Text Extraction. This C# OCR demo code illustrates how to extract text from Png and save to png.pdf. // Set the training data path.
exporting pdf data to excel; extract data from pdf
C# PDF File Permission Library: add, remove, update PDF file
Form Process. Data: Read, Extract Field Data. Data: Auto Fill-in Field Data. Field: Insert Choose to offer PDF annotation and content extraction functions.
java read pdf form fields; fill in pdf form reader
from flask import Flask
from werkzeug.serving import run_simple
app = Flask(__name__)
app.debug True
@app.route(/)
def hello_world():
return Hello World!
if __name__ == __main__:
run_simple(localhost5000, app,
use_reloader=True, use_debugger=True, use_evalex=True)
18.3.2 Combining Applications
If you have entirely separated applications and you want them to work next to
each other in the same Python interpreter process you can take advantage of the
werkzeug.wsgi.DispatcherMiddleware. Theideahereisthat t eachFlaskapplication
is a valid WSGI application and they are combined by the dispatcher middleware into
alarger one that dispatched based on prefix.
For example you could have your main application run on / and your backend inter-
face on /backend:
from werkzeug.wsgi import DispatcherMiddleware
from frontend_app import application as frontend
from backend_app import application as backend
application = DispatcherMiddleware(frontend, {
/backend:
backend
})
18.3.3 Dispatch by Subdomain
Sometimes you might want to use multiple instances of the same application with
different configurations. Assuming the application is created inside a function and
you can call that function to instantiate it, that is really easy to implement. In order to
develop your application to support creating new instances in functions have a look
at the Application Factories pattern.
Avery common example would be creating applications per subdomain. For instance
you configure your webserver to dispatch all requests for all subdomains to your
application and you then use the subdomain information to create user-specific in-
stances. Once you have your server set up to listen on all subdomains you can use a
very simple WSGI application to do the dynamic application creation.
The perfect level for abstraction in that regard is the WSGI layer. You write your own
106
VB.NET PDF File Permission Library: add, remove, update PDF file
Data: Read, Extract Field Data. Data: Auto Fill-in Field Data. Field: Insert, Delete, Update Choose to offer PDF annotation and content extraction functions.
pdf form data extraction; how to save a pdf form in reader
C# PDF File Merge Library: Merge, append PDF files in C#.net, ASP.
Merge Microsoft Office Word, Excel and PowerPoint data to PDF form. PDF document splitting, PDF page reordering and PDF page image and text extraction.
how to extract data from pdf file using java; extract data from pdf using java
WSGI application that looks at the request that comes and delegates it to your Flask
application. If that application does notexist yet, itis dynamically created and remem-
bered:
from threading import Lock
class SubdomainDispatcher(object):
def __init__(self, domain, , create_app):
self.domain domain
self.create_app create_app
self.lock Lock()
self.instances {}
def get_application(self, host):
host = host.split(:)[0]
assert host.endswith(self.domain), Configuration error
subdomain = host[:-len(self.domain)].rstrip(.)
with self.lock:
app self.instances.get(subdomain)
if app is None:
app self.create_app(subdomain)
self.instances[subdomain] app
return app
def __call__(self, environ, , start_response):
app self.get_application(environ[HTTP_HOST])
return app(environ, start_response)
This dispatcher can then be used like this:
from myapplication import create_app, get_user_for_subdomain
from werkzeug.exceptions import NotFound
def make_app(subdomain):
user = get_user_for_subdomain(subdomain)
if user is None:
# if there is no user for that subdomain we still have
# to return a WSGI application that handles that request.
# We can then just return the NotFound() exception as
# application which will render a default 404 page.
# You might also redirect the user to the main page then
return NotFound()
# otherwise create the application for the specific user
return create_app(user)
application = SubdomainDispatcher(example.com, make_app)
107
18.3.4 Dispatch by Path
Dispatching by a path onthe URL is very similar. Instead of looking atthe Host header
to figure out the subdomain one simply looks at the request path up to the first slash:
from threading import Lock
from werkzeug.wsgi import pop_path_info, peek_path_info
class PathDispatcher(object):
def __init__(self, default_app, , create_app):
self.default_app default_app
self.create_app create_app
self.lock Lock()
self.instances {}
def get_application(self, prefix):
with self.lock:
app self.instances.get(prefix)
if app is None:
app self.create_app(prefix)
if app is not None:
self.instances[prefix] app
return app
def __call__(self, environ, , start_response):
app self.get_application(peek_path_info(environ))
if app is not None:
pop_path_info(environ)
else:
app self.default_app
return app(environ, start_response)
The big difference between this and the subdomain one is that this one falls back to
another application if the creator function returns None:
from myapplication import create_app, default_app, , get_user_for_prefix
def make_app(prefix):
user = get_user_for_prefix(prefix)
if user is not None:
return create_app(user)
application = PathDispatcher(default_app, make_app)
18.4 Implementing API Exceptions
It’s very common to implement RESTful APIs on top of Flask. One of the first thing
that developers run into is the realization that the builtin exceptions are not expressive
108
enough for APIs and that the content type of text/html they are emitting is not very
useful for API consumers.
The better solution than using abort to signal errors for invalid API usage is to im-
plement your own exception type and install an error handler for it that produces the
errors in the format the user is expecting.
18.4.1 Simple Exception Class
The basic idea is to introduce a new exception that can take a proper human readable
message, a status code for the error and some optional payload to give more context
for the error.
This is a simple example:
from flask import jsonify
class InvalidUsage(Exception):
status_code 400
def __init__(self, message, , status_code=None, payload=None):
Exception.__init__(self)
self.message message
if status_code is not None:
self.status_code status_code
self.payload payload
def to_dict(self):
rv dict(self.payload or ())
rv[messageself.message
return rv
Aview can now raise that exception with an error message. Additionally some extra
payload can be provided as a dictionary through the payload parameter.
18.4.2 Registering an Error Handler
At that point views can raise that error, but it would immediately result in an internal
server error. The reason for this is that there is no handler registered for this error
class. That however is easy to add:
@app.errorhandler(InvalidAPIUsage)
def handle_invalid_usage(error):
response = jsonify(error.to_dict())
response.status_code = error.status_code
return response
109
18.4.3 Usage in Views
Here is how a view can use that functionality:
@app.route(/foo)
def get_foo():
raise InvalidUsage(This view w is gone, status_code=410)
18.5 Using URL Processors
New in version 0.7.
Flask 0.7 introduces the concept of URL processors. The idea is that you might have
abunch of resources with common parts in the URL that you don’t always explicitly
wantto provide. For instance you might have a bunch of URLs that have the language
code in it but you don’t want to have to handle it in every single function yourself.
URL processorsare especially helpful when combined withblueprints. We will handle
both application specific URL processors here as well as blueprint specifics.
18.5.1 Internationalized Application URLs
Consider an application like this:
from flask import Flask, g
app = Flask(__name__)
@app.route(/<lang_code>/)
def index(lang_code):
g.lang_code = lang_code
...
@app.route(/<lang_code>/about)
def about(lang_code):
g.lang_code = lang_code
...
This is an awful lot of repetition as you have to handle the language code setting on the
gobject yourself in every single function. Sure, a decorator could be used to simplify
this, but if you want to generate URLs from one function to another you would have
to still provide the language code explicitly which can be annoying.
For the latter, this is where url_defaults() functions come in. They can automatically
inject values into a call for url_for() automatically. The code below checks if the
language code is not yet in the dictionary of URL values and if the endpoint wants a
value named ’lang_code’:
110
Documents you may be interested
Documents you may be interested