Update README to remove non-ASCII characters. Refs #434.

This commit is contained in:
Gary Reynolds 2017-02-21 21:02:24 +11:00
parent 3579735cb3
commit 8b7201f9b9
1 changed files with 20 additions and 20 deletions

View File

@ -9,7 +9,7 @@ Software-as-a-Service website.
Django provides currently no simple way to support multiple tenants
using the same project instance, even when only the data is different.
Because we dont want you running many copies of your project, youll be
Because we don't want you running many copies of your project, you'll be
able to have:
- Multiple customers running on the same instance
@ -20,10 +20,10 @@ What are schemas
----------------
A schema can be seen as a directory in an operating system, each
directory (schema) with its own set of files (tables and objects). This
directory (schema) with it's own set of files (tables and objects). This
allows the same table name and objects to be used in different schemas
without conflict. For an accurate description on schemas, see
`PostgreSQLs official documentation on schemas`_.
`PostgreSQL's official documentation on schemas`_.
Why schemas
-----------
@ -31,7 +31,7 @@ Why schemas
There are typically three solutions for solving the multitenancy
problem.
1. Isolated Approach: Separate Databases. Each tenant has its own
1. Isolated Approach: Separate Databases. Each tenant has it's own
database.
2. Semi Isolated Approach: Shared Database, Separate Schemas. One
@ -48,8 +48,8 @@ represents the ideal compromise between simplicity and performance.
multitenancy. Plus, you only manage one database.
- Performance: make use of shared connections, buffers and memory.
Each solution has its up and down sides, for a more in-depth
discussion, see Microsofts excellent article on `Multi-Tenant Data
Each solution has it's up and down sides, for a more in-depth
discussion, see Microsoft's excellent article on `Multi-Tenant Data
Architecture`_.
How it works
@ -58,11 +58,11 @@ How it works
Tenants are identified via their host name (i.e tenant.domain.com). This
information is stored on a table on the ``public`` schema. Whenever a
request is made, the host name is used to match a tenant in the
database. If theres a match, the search path is updated to use this
tenants schema. So from now on all queries will take place at the
tenants schema. For example, suppose you have a tenant ``customer`` at
database. If there's a match, the search path is updated to use this
tenant's schema. So from now on all queries will take place at the
tenant's schema. For example, suppose you have a tenant ``customer`` at
http://customer.example.com. Any request incoming at
``customer.example.com`` will automatically use ``customer``\ s schema
``customer.example.com`` will automatically use ``customer``\ 's schema
and make the tenant available at the request. If no tenant is found, a
404 error is raised. This also means you should have a tenant for your
main domain, typically using the ``public`` schema. For more information
@ -94,7 +94,7 @@ the host name to identify which view to serve.
Magic
~~~~~
Everyone loves magic! Youll be able to have all this barely having to
Everyone loves magic! You'll be able to have all this barely having to
change your code!
Setup & Documentation
@ -113,7 +113,7 @@ Your ``DATABASE_ENGINE`` setting needs to be changed to
'ENGINE': 'tenant_schemas.postgresql_backend',
# ..
}
}
}
Add the middleware ``tenant_schemas.middleware.TenantMiddleware`` to the
top of ``MIDDLEWARE_CLASSES``, so that each request can be set to use
@ -125,9 +125,9 @@ the correct schema.
'tenant_schemas.middleware.TenantMiddleware',
#...
)
Add ``tenant_schemas.routers.TenantSyncRouter`` to your `DATABASE_ROUTERS`
setting, so that the correct apps can be synced, depending on what's
Add ``tenant_schemas.routers.TenantSyncRouter`` to your `DATABASE_ROUTERS`
setting, so that the correct apps can be synced, depending on what's
being synced (shared or tenant).
.. code-block:: python
@ -182,13 +182,13 @@ will automatically create and sync/migrate the schema.
tenant.save()
Any request made to ``tenant.my-domain.com`` will now automatically set
your PostgreSQLs ``search_path`` to ``tenant1`` and ``public``, making
your PostgreSQL's ``search_path`` to ``tenant1`` and ``public``, making
shared apps available too. This means that any call to the methods
``filter``, ``get``, ``save``, ``delete`` or any other function
involving a database connection will now be done at the tenants schema,
so you shouldnt need to change anything at your views.
involving a database connection will now be done at the tenant's schema,
so you shouldn't need to change anything at your views.
Youre all set, but we have left key details outside of this short
You're all set, but we have left key details outside of this short
tutorial, such as creating the public tenant and configuring shared and
tenant specific apps. Complete instructions can be found at
`django-tenant-schemas.readthedocs.io`_.
@ -197,7 +197,7 @@ tenant specific apps. Complete instructions can be found at
.. _django: https://www.djangoproject.com/
.. _PostgreSQL schemas: http://www.postgresql.org/docs/9.1/static/ddl-schemas.html
.. _PostgreSQLs official documentation on schemas: http://www.postgresql.org/docs/9.1/static/ddl-schemas.html
.. _PostgreSQL's official documentation on schemas: http://www.postgresql.org/docs/9.1/static/ddl-schemas.html
.. _Multi-Tenant Data Architecture: http://msdn.microsoft.com/en-us/library/aa479086.aspx
.. |PyPi version| image:: https://img.shields.io/pypi/v/django-tenant-schemas.svg