CHAPTER
TWENTYFIVE
UNICODE IN FLASK
Flask like Jinja2 and Werkzeug is totally Unicode based when it comes to text. Not
only these libraries, also the majority of web related Python libraries that deal with
text. If you don’t know Unicode so far, you should probably readTheAbsoluteMin-
imum Every Software Developer Absolutely, Positively Must Know About Unicode
and Character Sets. Thispartofthedocumentationjusttriestocovertheverybasics
so that you have a pleasant experience with Unicode related things.
25.1 Automatic Conversion
Flask has a few assumptions about your application (which you can change of course)
that give you basic and painless Unicode support:
• the encoding for text on your website is UTF-8
• internally you will always use Unicode exclusively for text except for literal
strings with only ASCII character points.
• encoding and decoding happens whenever you are talking over a protocol that
requires bytes to be transmitted.
So what does this mean to you?
HTTP is based on bytes. Not only the protocol, also the system used to address doc-
uments on servers (so called URIs or URLs). However HTML which is usually trans-
mitted on top of HTTP supports a large variety of character sets and which ones are
used, are transmitted in an HTTP header. To not make this too complex Flask just
assumes that if you are sending Unicode out you want it to be UTF-8 encoded. Flask
will do the encoding and setting of the appropriate headers for you.
The same is true if you are talking to databases with the help of SQLAlchemy or a
similar ORM system. Some databases have a protocol that already transmits Unicode
and if they do not, SQLAlchemy or your other ORM should take care of that.
251
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 form field recognition; extract data from pdf form to excel
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 from pdf file; exporting data from excel to pdf form
25.2 The Golden Rule
So the rule of thumb: if you are not dealing with binary data, work with Unicode.
What does working with Unicode in Python 2.x mean?
• as long as you are using ASCII charpoints only (basically numbers, some special
characters oflatinletters withoutumlauts or anything fancy)you canuse regular
string literals (’Hello World’).
• if you need anything else than ASCII in a string you have to mark this string as
Unicode string by prefixing it with a lowercase u. (like u’Hänsel und Gretel’)
• if you are using non-Unicode characters in your Python files you have to tell
Python which encoding your file uses. Again, I recommend UTF-8 for this pur-
pose. To tell the interpreter your encoding you can put the # -*- coding: utf-8
-*- into the first or second line of your Python source file.
• Jinja is configured to decode the template files from UTF-8. So make sure to tell
your editor to save the file as UTF-8 there as well.
25.3 Encoding and Decoding Yourself
If you are talking with a filesystem or something that is not really based on Unicode
you will have to ensure that you decode properly when working with Unicode inter-
face. So for example if you want to load a file on the filesystem and embed it into a
Jinja2 template you will have to decode it from the encoding of that file. Here the old
problem that text files do not specify their encoding comes into play. So do yourself a
favour and limit yourself to UTF-8 for text files as well.
Anyways. To load such a file with Unicode you can use the built-in str.decode()
method:
def read_file(filename, charset=utf-8):
with open(filename, r) as f:
return f.read().decode(charset)
To go from Unicode into a specific charset such as UTF-8 you can use the
unicode.encode() method:
def write_file(filename, contents, charset=utf-8):
with open(filename, w) as f:
f.write(contents.encode(charset))
25.4 Configuring Editors
Most editors save as UTF-8 by default nowadays but in case your editor is not config-
ured to do this you have to change it. Here some common ways to set your editor to
store as UTF-8:
252
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.
pdf data extraction tool; extract data from pdf using java
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.
pdf data extraction to excel; pdf form data extraction
• Vim: put set enc=utf-8 to your .vimrc file.
• Emacs: either use an encoding cookie or put this into your .emacs file:
(prefer-coding-system utf-8)
(setq default-buffer-file-coding-system utf-8)
• Notepad++:
1. Go to Settings -> Preferences ...
2. Select the “New Document/Default Directory” tab
3. Select “UTF-8 without BOM” as encoding
It is also recommended to use the Unix newline format, you can select it in the
same panel but this is not a requirement.
253
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.
extracting data from pdf forms to excel; how to flatten a 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
export pdf form data to excel spreadsheet; how to extract data from pdf file using java
254
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
extract data from pdf c#; how to save filled out pdf form in reader
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.
using pdf forms to collect data; how to type into a pdf form in reader
CHAPTER
TWENTYSIX
FLASK EXTENSION DEVELOPMENT
Flask, being a microframework, oftenrequiressome repetitive steps to geta third party
library working. Because very often these steps could be abstracted to support multi-
ple projects theFlaskExtensionRegistry was created.
If you want to create your own Flask extension for something that does not exist yet,
this guide to extension development will help you get your extension running in no
time and to feel like users would expect your extension to behave.
26.1 Anatomy of an Extension
Extensions are all located in a package called flask_something where “something” is
the name of the library you want to bridge. So for example if you plan to add support
for a library named simplexml to Flask, you would name your extension’s package
flask_simplexml.
The name oftheactual extension (the humanreadable name)howeverwould be some-
thing like “Flask-SimpleXML”. Make sure to include the name “Flask” somewhere in
that name and that you check the capitalization. This is how users can then register
dependencies to your extension in their setup.py files.
Flask sets up a redirect package called flask.ext where users should import the ex-
tensions from. If you for instance have a package called flask_something users would
import it as flask.ext.something. This is done to transition from the old namespace
packages. See Extension Import Transition for more details.
But how do extensions look like themselves? An extension has to ensure that it works
with multiple Flask application instances at once. This is a requirement because many
people will use patterns like the Application Factories pattern to create their application
as needed to aid unittests and to support multiple configurations. Because of that it is
crucial that your application supports that kind of behavior.
Most importantly the extension must be shipped with a setup.py file and registered
on PyPI. Also the development checkout link should work so that people can easily
install the development version into their virtualenv without having to download the
library by hand.
255
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.
make pdf form editable in reader; filling out pdf forms with reader
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.
exporting pdf data to excel; exporting pdf form to excel
Flask extensions must be licensed under a BSD, MIT or more liberal license to be able
to be enlisted in the Flask Extension Registry. Keep in mind that the Flask Extension
Registry is a moderated place and libraries will be reviewed upfront if they behave as
required.
26.2 “Hello Flaskext!”
So let’s get started with creating such a Flask extension. The extension we want to
create here will provide very basic support for SQLite3.
First we create the following folder structure:
flask-sqlite3/
flask_sqlite3.py
LICENSE
README
Here’s the contents of the most important files:
26.2.1 setup.py
The next file that is absolutely required is the setup.py file which is used to install your
Flask extension. The following contents are something you can work with:
"""
Flask-SQLite3
-------------
This is the description for that library
"""
from setuptools import setup
setup(
name=Flask-SQLite3,
version=1.0,
url=http://example.com/flask-sqlite3/,
license=BSD,
author=Your Name,
author_email=your-email@example.com,
description=Very short description,
long_description=__doc__,
py_modules=[flask_sqlite3],
# if you would be using a package instead use packages instead
# of py_modules:
# packages=[flask_sqlite3],
zip_safe=False,
include_package_data=True,
platforms=any,
256
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.
java read pdf form fields; extract pdf form data to excel
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.
flatten pdf form in reader; extract data from pdf form
install_requires=[
Flask
],
classifiers=[
Environment :: Web Environment,
Intended Audience :: Developers,
License :: OSI Approved :: BSD License,
Operating System :: OS Independent,
Programming Language :: Python,
Topic :: Internet :: WWW/HTTP :: Dynamic Content,
Topic :: Software Development :: Libraries :: Python Modules
]
)
That’s a lot of code but you can really just copy/paste that from existing extensions
and adapt.
26.2.2 flask_sqlite3.py
Now this is where your extension code goes. But how exactly should such an exten-
sion look like? What are the best practices? Continue reading for some insight.
26.3 Initializing Extensions
Many extensions will need some kind of initialization step. For example, consider an
application that’s currently connecting to SQLite like the documentation suggests (Us-
ing SQLite 3 with Flask). So how does the extension know the name of the application
object?
Quite simple: you pass it to it.
There are two recommended ways for an extension to initialize:
initialization functions:
If your extension is called helloworld you might have a function called
init_helloworld(app[, extra_args]) that initializes the extensionfor that
application. It could attach before / after handlers etc.
classes:
Classes work mostly like initialization functions but can later be used to
further change the behavior. For an example look at how theOAuthexten-
sionworks: thereisanOAuthobjectthatprovidessomehelperfunctions
like OAuth.remote_app to create a reference to a remote application that uses
OAuth.
What to use depends on what you have in mind. For the SQLite 3 extension we will
use the class-based approach because it will provide users with an object that handles
opening and closing database connections.
257
What’s important about classes is that they encourage to be shared around on mod-
ule level. In that case, the object itself must not under any circumstances store any
application specific state and must be shareable between different application.
26.4 The Extension Code
Here’s the contents of the flask_sqlite3.py for copy/paste:
import sqlite3
from flask import current_app
# Find the stack on which we want to store the database connection.
# Starting with Flask 0.9, the _app_ctx_stack is the correct one,
# before that we need to use the _request_ctx_stack.
try:
from flask import _app_ctx_stack as stack
except ImportError:
from flask import _request_ctx_stack as stack
class SQLite3(object):
def __init__(self, app=None):
self.app app
if app is not None:
self.init_app(app)
def init_app(self, app):
app.config.setdefault(SQLITE3_DATABASE:memory:)
# Use the newstyle teardown_appcontext if its available,
# otherwise fall back to the request context
if hasattr(app, teardown_appcontext):
app.teardown_appcontext(self.teardown)
else:
app.teardown_request(self.teardown)
def connect(self):
return sqlite3.connect(current_app.config[SQLITE3_DATABASE])
def teardown(self, exception):
ctx = stack.top
if hasattr(ctx, sqlite3_db):
ctx.sqlite3_db.close()
@property
def connection(self):
ctx = stack.top
if ctx is not None:
if not hasattr(ctx, sqlite3_db):
258
ctx.sqlite3_db self.connect()
return ctx.sqlite3_db
So here’s what these lines of code do:
1. The __init__ method takes an optional app object and, if supplied, will call
init_app.
2. The init_app method exists so that the SQLite3 object can be instantiated with-
out requiring an app object. This method supports the factory pattern for cre-
ating applications. The init_app will set the configuration for the database, de-
faulting to an in memory database if no configuration is supplied. In addition,
the init_app method attaches the teardown handler. It will try to use the new-
style app context handler and if it does not exist, falls back to the request context
one.
3. Next, we define a connect method that opens a database connection.
4. Finally, we add a connection property that on first access opens the database
connection and stores it on the context. This is also the recommended way to
handling resources: fetch resources lazily the first time they are used.
Note here that we’re attaching our database connection to the top application
context via _app_ctx_stack.top. Extensions should use the top context for stor-
ing their own information with a sufficiently complex name. Note that we’re
falling back to the _request_ctx_stack.top if the application is using an older
version of Flask that does not support it.
So why did we decide on a class-based approach here? Because using our extension
looks something like this:
from flask import Flask
from flask_sqlite3 import SQLite3
app = Flask(__name__)
app.config.from_pyfile(the-config.cfg)
db = SQLite3(app)
You can then use the database from views like this:
@app.route(/)
def show_all():
cur = db.connection.cursor()
cur.execute(...)
Likewise if you are outside of a request but you are using Flask 0.9 or later with the
app context support, you can use the database in the same way:
with app.app_context():
cur = db.connection.cursor()
cur.execute(...)
At the end of the with block the teardown handles will be executed automatically.
259
Additionally, the init_app method is used to support the factory pattern for creating
apps:
db = Sqlite3()
# Then later on.
app = create_app(the-config.cfg)
db.init_app(app)
Keep in mind that supporting this factory pattern for creating apps is required for
approved flask extensions (described below).
Note on init_app
As you noticed, init_app does not assign app to self. This is intentional! Class based
Flask extensions must only store the application on the object when the application
was passed to the constructor. This tells the extension: I am not interested in using
multiple applications.
When the extension needs to find the current application and it does not have a refer-
ence to it, it must either use the current_app context local or change the API in a way
that you can pass the application explicitly.
26.5 Using _app_ctx_stack
In the example above, before every request, a sqlite3_db variable is assigned
to _app_ctx_stack.top. In a view function, this variable is accessible using the
connection property of SQLite3. During the teardown of a request, the sqlite3_db
connection is closed. By using this pattern, the same connection to the sqlite3 database
is accessible to anything that needs it for the duration of the request.
If the _app_ctx_stack does not exist because the user uses an old version of Flask, it is
recommended to fall back to _request_ctx_stack which is bound to a request.
26.6 Teardown Behavior
This is only relevant if you want to support Flask 0.6 and older
Due to thechange inFlask 0.7 regarding functions thatare runat the end of the request
your extension will have to be extra careful there if it wants to continue to support
older versions of Flask. The following pattern is a good way to support both:
def close_connection(response):
ctx = _request_ctx_stack.top
ctx.sqlite3_db.close()
return response
260
Documents you may be interested
Documents you may be interested