Add login endpoint
parent
7558ab4737
commit
0a0f18fd66
|
@ -30,6 +30,7 @@ pip-log.txt
|
|||
venv
|
||||
*.pyc
|
||||
build
|
||||
env
|
||||
|
||||
# Instance dir
|
||||
instance/
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
# App initialization
|
||||
from flask_api import FlaskAPI
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
from flask_bcrypt import Bcrypt
|
||||
|
||||
app = FlaskAPI(__name__, instance_relative_config=True)
|
||||
app.config.from_object('config')
|
||||
app.config.from_pyfile('config.py', silent=True)
|
||||
db = SQLAlchemy(app)
|
||||
bcrypt = Bcrypt(app)
|
||||
|
||||
|
||||
def setup_blueprints(app):
|
||||
|
|
|
@ -1,20 +1,70 @@
|
|||
from app import db
|
||||
from flask import request, jsonify, abort
|
||||
from .models import Account, Role
|
||||
from app import bcrypt
|
||||
from flask import request, jsonify
|
||||
from .models import Account
|
||||
|
||||
|
||||
def initialize_routes(accounts):
|
||||
@accounts.route("/", methods=['POST'])
|
||||
def create():
|
||||
def create_account():
|
||||
print(request.data)
|
||||
user = request.data.get('user')
|
||||
acct = Account(user.get('username'),
|
||||
user.get('password'),
|
||||
user.get('email'),
|
||||
2)
|
||||
acct.save()
|
||||
if not Account.exists_with_any_of(
|
||||
username=user.get('username'), email=user.get('email')):
|
||||
password_hash = bcrypt.generate_password_hash(
|
||||
user.get('password')
|
||||
).decode('utf-8')
|
||||
acct = Account(user.get('username'),
|
||||
password_hash,
|
||||
user.get('email'))
|
||||
acct.save()
|
||||
response = jsonify({
|
||||
'status': 'success',
|
||||
'message': 'Success!'
|
||||
})
|
||||
response.status_code = 200
|
||||
return response
|
||||
else:
|
||||
response = jsonify({
|
||||
'status': 'error',
|
||||
'message': 'User already exists!'
|
||||
})
|
||||
response.status_code = 422
|
||||
return response
|
||||
|
||||
@accounts.route("/token", methods=['POST'])
|
||||
def create_token():
|
||||
print(request.data)
|
||||
user = request.data.get('user')
|
||||
if not user:
|
||||
response = jsonify({
|
||||
'status': 'error',
|
||||
'message': 'Invalid request'
|
||||
})
|
||||
response.status_code = 400
|
||||
return response
|
||||
|
||||
if not Account.exists(username=user.get('username')):
|
||||
response = jsonify({
|
||||
'status': 'error',
|
||||
'message': 'Invalid credentials'
|
||||
})
|
||||
response.status_code = 422
|
||||
return response
|
||||
|
||||
account = Account.get(username=user.get('username'))
|
||||
if not bcrypt.check_password_hash(
|
||||
account.password, user.get('password')):
|
||||
response = jsonify({
|
||||
'status': 'error',
|
||||
'message': 'Invalid credentials'
|
||||
})
|
||||
response.status_code = 422
|
||||
return response
|
||||
|
||||
response = jsonify({
|
||||
'message':'Success!'
|
||||
'status': 'success',
|
||||
'message': 'Successfully logged in',
|
||||
'token': account.create_auth_token()
|
||||
})
|
||||
response.status_code = 200
|
||||
return response
|
||||
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
from app import db
|
||||
import jwt
|
||||
import datetime
|
||||
from app import db, app
|
||||
|
||||
|
||||
class Account(db.Model):
|
||||
|
@ -11,7 +13,7 @@ class Account(db.Model):
|
|||
role_id = db.Column(db.Integer, db.ForeignKey("roles.id"))
|
||||
role = db.relationship("Role", foreign_keys=[role_id])
|
||||
|
||||
def __init__(self, username, password, email, role):
|
||||
def __init__(self, username, password, email, role=2):
|
||||
self.username = str(username)
|
||||
self.password = str(password)
|
||||
self.email = str(email)
|
||||
|
@ -21,16 +23,60 @@ class Account(db.Model):
|
|||
self.role_id = int(role)
|
||||
|
||||
def save(self):
|
||||
"""
|
||||
Stores current user to database
|
||||
This may raise errors
|
||||
"""
|
||||
db.session.add(self)
|
||||
db.session.commit()
|
||||
|
||||
@staticmethod
|
||||
def exists_with_any_of(**kwargs):
|
||||
"""
|
||||
Checks if user with any of the given arguments exists
|
||||
"""
|
||||
for key, value in kwargs.items():
|
||||
args = {key: value}
|
||||
if Account.query.filter_by(**args).first():
|
||||
return True
|
||||
return False
|
||||
|
||||
@staticmethod
|
||||
def exists(**kwargs):
|
||||
"""
|
||||
Checks if user with all of the given arguments exists
|
||||
"""
|
||||
if Account.query.filter_by(**kwargs).first():
|
||||
return True
|
||||
return False
|
||||
|
||||
@staticmethod
|
||||
def get_all():
|
||||
return Account.query.all()
|
||||
|
||||
@staticmethod
|
||||
def get(accId):
|
||||
return Account.query.filter_by(id = accId)
|
||||
def get(**kwargs):
|
||||
return Account.query.filter_by(**kwargs).first()
|
||||
|
||||
def create_auth_token(self):
|
||||
"""
|
||||
Generates the Auth Token
|
||||
:return: string
|
||||
"""
|
||||
try:
|
||||
current_time = datetime.datetime.utcnow()
|
||||
payload = {
|
||||
'exp': current_time + datetime.timedelta(days=0, hours=1),
|
||||
'iat': current_time,
|
||||
'sub': self.id
|
||||
}
|
||||
return jwt.encode(
|
||||
payload,
|
||||
app.config.get('SECRET_KEY'),
|
||||
algorithm='HS256'
|
||||
).decode('utf-8')
|
||||
except Exception as e:
|
||||
return e
|
||||
|
||||
def __repr__(self):
|
||||
return '<Account (name=%s, role=%s)>' % self.username, self.role
|
||||
|
@ -55,7 +101,7 @@ class Role(db.Model):
|
|||
|
||||
@staticmethod
|
||||
def get(roleId):
|
||||
return Role.query.filter_by(id = accId)
|
||||
return Role.query.filter_by(id=roleId)
|
||||
|
||||
def __repr__(self):
|
||||
return '<Role %s>' % self.name
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
import os
|
||||
|
||||
# App configuration
|
||||
DEBUG = False
|
||||
|
||||
# Define the application directory
|
||||
import os
|
||||
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
|
||||
|
||||
# Define the database - we are working with
|
||||
|
@ -24,7 +25,7 @@ CSRF_ENABLED = True
|
|||
CSRF_SESSION_KEY = "secret"
|
||||
|
||||
# Secret key for signing cookies
|
||||
SECRET_KEY = "secret"
|
||||
SECRET_KEY = "?['Z(Z\x83Y \x06T\x12\x96<\xff\x12\xe0\x1b\xd1J\xe0\xd9ld"
|
||||
|
||||
# MQTT configuration
|
||||
MQTT_BROKER_URL = 'broker.hivemq.com'
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/Python
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/include/python3.6m
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/__future__.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_bootlocale.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_collections_abc.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_dummy_thread.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_weakrefset.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/abc.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/base64.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/bisect.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/codecs.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/collections
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/config-3.6m-darwin
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/copy.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/copyreg.py
|
|
@ -1,101 +0,0 @@
|
|||
import os
|
||||
import sys
|
||||
import warnings
|
||||
import imp
|
||||
import opcode # opcode is not a virtualenv module, so we can use it to find the stdlib
|
||||
# Important! To work on pypy, this must be a module that resides in the
|
||||
# lib-python/modified-x.y.z directory
|
||||
|
||||
dirname = os.path.dirname
|
||||
|
||||
distutils_path = os.path.join(os.path.dirname(opcode.__file__), 'distutils')
|
||||
if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)):
|
||||
warnings.warn(
|
||||
"The virtualenv distutils package at %s appears to be in the same location as the system distutils?")
|
||||
else:
|
||||
__path__.insert(0, distutils_path)
|
||||
real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ('', '', imp.PKG_DIRECTORY))
|
||||
# Copy the relevant attributes
|
||||
try:
|
||||
__revision__ = real_distutils.__revision__
|
||||
except AttributeError:
|
||||
pass
|
||||
__version__ = real_distutils.__version__
|
||||
|
||||
from distutils import dist, sysconfig
|
||||
|
||||
try:
|
||||
basestring
|
||||
except NameError:
|
||||
basestring = str
|
||||
|
||||
## patch build_ext (distutils doesn't know how to get the libs directory
|
||||
## path on windows - it hardcodes the paths around the patched sys.prefix)
|
||||
|
||||
if sys.platform == 'win32':
|
||||
from distutils.command.build_ext import build_ext as old_build_ext
|
||||
class build_ext(old_build_ext):
|
||||
def finalize_options (self):
|
||||
if self.library_dirs is None:
|
||||
self.library_dirs = []
|
||||
elif isinstance(self.library_dirs, basestring):
|
||||
self.library_dirs = self.library_dirs.split(os.pathsep)
|
||||
|
||||
self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs"))
|
||||
old_build_ext.finalize_options(self)
|
||||
|
||||
from distutils.command import build_ext as build_ext_module
|
||||
build_ext_module.build_ext = build_ext
|
||||
|
||||
## distutils.dist patches:
|
||||
|
||||
old_find_config_files = dist.Distribution.find_config_files
|
||||
def find_config_files(self):
|
||||
found = old_find_config_files(self)
|
||||
system_distutils = os.path.join(distutils_path, 'distutils.cfg')
|
||||
#if os.path.exists(system_distutils):
|
||||
# found.insert(0, system_distutils)
|
||||
# What to call the per-user config file
|
||||
if os.name == 'posix':
|
||||
user_filename = ".pydistutils.cfg"
|
||||
else:
|
||||
user_filename = "pydistutils.cfg"
|
||||
user_filename = os.path.join(sys.prefix, user_filename)
|
||||
if os.path.isfile(user_filename):
|
||||
for item in list(found):
|
||||
if item.endswith('pydistutils.cfg'):
|
||||
found.remove(item)
|
||||
found.append(user_filename)
|
||||
return found
|
||||
dist.Distribution.find_config_files = find_config_files
|
||||
|
||||
## distutils.sysconfig patches:
|
||||
|
||||
old_get_python_inc = sysconfig.get_python_inc
|
||||
def sysconfig_get_python_inc(plat_specific=0, prefix=None):
|
||||
if prefix is None:
|
||||
prefix = sys.real_prefix
|
||||
return old_get_python_inc(plat_specific, prefix)
|
||||
sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__
|
||||
sysconfig.get_python_inc = sysconfig_get_python_inc
|
||||
|
||||
old_get_python_lib = sysconfig.get_python_lib
|
||||
def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
|
||||
if standard_lib and prefix is None:
|
||||
prefix = sys.real_prefix
|
||||
return old_get_python_lib(plat_specific, standard_lib, prefix)
|
||||
sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__
|
||||
sysconfig.get_python_lib = sysconfig_get_python_lib
|
||||
|
||||
old_get_config_vars = sysconfig.get_config_vars
|
||||
def sysconfig_get_config_vars(*args):
|
||||
real_vars = old_get_config_vars(*args)
|
||||
if sys.platform == 'win32':
|
||||
lib_dir = os.path.join(sys.real_prefix, "libs")
|
||||
if isinstance(real_vars, dict) and 'LIBDIR' not in real_vars:
|
||||
real_vars['LIBDIR'] = lib_dir # asked for all
|
||||
elif isinstance(real_vars, list) and 'LIBDIR' in args:
|
||||
real_vars = real_vars + [lib_dir] # asked for list
|
||||
return real_vars
|
||||
sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__
|
||||
sysconfig.get_config_vars = sysconfig_get_config_vars
|
|
@ -1,6 +0,0 @@
|
|||
# This is a config file local to this virtualenv installation
|
||||
# You may include options that will be used by all distutils commands,
|
||||
# and by easy_install. For instance:
|
||||
#
|
||||
# [easy_install]
|
||||
# find_links = http://mylocalsite
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/encodings
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/enum.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/fnmatch.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/functools.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/genericpath.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/hashlib.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/heapq.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/hmac.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/imp.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/importlib
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/io.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/keyword.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/linecache.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/locale.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ntpath.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/operator.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/os.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/posixpath.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/random.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/re.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/reprlib.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/rlcompleter.py
|
|
@ -1 +0,0 @@
|
|||
/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/shutil.py
|
|
@ -1,46 +0,0 @@
|
|||
Flask
|
||||
-----
|
||||
|
||||
Flask is a microframework for Python based on Werkzeug, Jinja 2 and good
|
||||
intentions. And before you ask: It's BSD licensed!
|
||||
|
||||
Flask is Fun
|
||||
````````````
|
||||
|
||||
Save in a hello.py:
|
||||
|
||||
.. code:: python
|
||||
|
||||
from flask import Flask
|
||||
app = Flask(__name__)
|
||||
|
||||
@app.route("/")
|
||||
def hello():
|
||||
return "Hello World!"
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run()
|
||||
|
||||
And Easy to Setup
|
||||
`````````````````
|
||||
|
||||
And run it:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
$ pip install Flask
|
||||
$ python hello.py
|
||||
* Running on http://localhost:5000/
|
||||
|
||||
Ready for production? `Read this first <http://flask.pocoo.org/docs/deploying/>`.
|
||||
|
||||
Links
|
||||
`````
|
||||
|
||||
* `website <http://flask.pocoo.org/>`_
|
||||
* `documentation <http://flask.pocoo.org/docs/>`_
|
||||
* `development version
|
||||
<http://github.com/pallets/flask/zipball/master#egg=Flask-dev>`_
|
||||
|
||||
|
||||
|
|
@ -1 +0,0 @@
|
|||
pip
|
|
@ -1,33 +0,0 @@
|
|||
Copyright (c) 2015 by Armin Ronacher and contributors. See AUTHORS
|
||||
for more details.
|
||||
|
||||
Some rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms of the software as well
|
||||
as documentation, with or without modification, are permitted provided
|
||||
that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
|
||||
* The names of the contributors may not be used to endorse or
|
||||
promote products derived from this software without specific
|
||||
prior written permission.
|
||||
|
||||
THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
|
||||
NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGE.
|
|
@ -1,75 +0,0 @@
|
|||
Metadata-Version: 2.0
|
||||
Name: Flask
|
||||
Version: 0.12.2
|
||||
Summary: A microframework based on Werkzeug, Jinja2 and good intentions
|
||||
Home-page: http://github.com/pallets/flask/
|
||||
Author: Armin Ronacher
|
||||
Author-email: armin.ronacher@active-4.com
|
||||
License: BSD
|
||||
Platform: any
|
||||
Classifier: Development Status :: 4 - Beta
|
||||
Classifier: Environment :: Web Environment
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: BSD License
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 2
|
||||
Classifier: Programming Language :: Python :: 2.6
|
||||
Classifier: Programming Language :: Python :: 2.7
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.3
|
||||
Classifier: Programming Language :: Python :: 3.4
|
||||
Classifier: Programming Language :: Python :: 3.5
|
||||
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Requires-Dist: Jinja2 (>=2.4)
|
||||
Requires-Dist: Werkzeug (>=0.7)
|
||||
Requires-Dist: click (>=2.0)
|
||||
Requires-Dist: itsdangerous (>=0.21)
|
||||
|
||||
Flask
|
||||
-----
|
||||
|
||||
Flask is a microframework for Python based on Werkzeug, Jinja 2 and good
|
||||
intentions. And before you ask: It's BSD licensed!
|
||||
|
||||
Flask is Fun
|
||||
````````````
|
||||
|
||||
Save in a hello.py:
|
||||
|
||||
.. code:: python
|
||||
|
||||
from flask import Flask
|
||||
app = Flask(__name__)
|
||||
|
||||
@app.route("/")
|
||||
def hello():
|
||||
return "Hello World!"
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run()
|
||||
|
||||
And Easy to Setup
|
||||
`````````````````
|
||||
|
||||
And run it:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
$ pip install Flask
|
||||
$ python hello.py
|
||||
* Running on http://localhost:5000/
|
||||
|
||||
Ready for production? `Read this first <http://flask.pocoo.org/docs/deploying/>`.
|
||||
|
||||
Links
|
||||
`````
|
||||
|
||||
* `website <http://flask.pocoo.org/>`_
|
||||
* `documentation <http://flask.pocoo.org/docs/>`_
|
||||
* `development version
|
||||
<http://github.com/pallets/flask/zipball/master#egg=Flask-dev>`_
|
||||
|
||||
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
Flask-0.12.2.dist-info/DESCRIPTION.rst,sha256=DmJm8IBlBjl3wkm0Ly23jYvWbvK_mCuE5oUseYCijbI,810
|
||||
Flask-0.12.2.dist-info/LICENSE.txt,sha256=hLgKluMRHSnxG-L0EmrqjmKgG5cHlff6pIh3rCNINeI,1582
|
||||
Flask-0.12.2.dist-info/METADATA,sha256=OgSkJQ_kmrz4qEkS-OzYtL75uZmXAThymkOcGR4kXRQ,1948
|
||||
Flask-0.12.2.dist-info/RECORD,,
|
||||
Flask-0.12.2.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110
|
||||
Flask-0.12.2.dist-info/entry_points.txt,sha256=jzk2Wy2h30uEcqqzd4CVnlzsMXB-vaD5GXjuPMXmTmI,60
|
||||
Flask-0.12.2.dist-info/metadata.json,sha256=By8kZ1vY9lLEAGnRiWNBhudqKvLPo0HkZVXTYECyPKk,1389
|
||||
Flask-0.12.2.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6
|
||||
flask/__init__.py,sha256=sHdK1v6WRbVmCN0fEv990EE7rOT2UlamQkSof2d0Dt0,1673
|
||||
flask/__main__.py,sha256=cldbNi5zpjE68XzIWI8uYHNWwBHHVJmwtlXWk6P4CO4,291
|
||||
flask/_compat.py,sha256=VlfjUuLjufsTHJIjr_ZsnnOesSbAXIslBBgRe5tfOok,2802
|
||||
flask/app.py,sha256=6DPjtb5jUJWgL5fXksG5boA49EB3l-k9pWyftitbNNk,83169
|
||||
flask/blueprints.py,sha256=6HVasMcPcaq7tk36kCrgX4bnhTkky4G5WIWCyyJL8HY,16872
|
||||
flask/cli.py,sha256=2NXEdCOu5-4ymklxX4Lf6bjb-89I4VHYeP6xScR3i8E,18328
|
||||
flask/config.py,sha256=Ym5Jenyu6zAZ1fdVLeKekY9-EsKmq8183qnRgauwCMY,9905
|
||||
flask/ctx.py,sha256=UPA0YwoIlHP0txOGanC9lQLSGv6eCqV5Fmw2cVJRmgQ,14739
|
||||
flask/debughelpers.py,sha256=z-uQavKIymOZl0WQDLXsnacA00ERIlCx3S3Tnb_OYsE,6024
|
||||
flask/exthook.py,sha256=SvXs5jwpcOjogwJ7SNquiWTxowoN1-MHFoqAejWnk2o,5762
|
||||
flask/globals.py,sha256=I3m_4RssLhWW1R11zuEI8oFryHUHX3NQwjMkGXOZzg8,1645
|
||||
flask/helpers.py,sha256=KrsQ2Yo3lOVHvBTgQCLvpubgmTOpQdTTyiCOOYlwDuQ,38452
|
||||
flask/json.py,sha256=1zPM-NPLiWoOfGd0P14FxnEkeKtjtUZxMC9pyYyDBYI,9183
|
||||
flask/logging.py,sha256=UG-77jPkRClk9w1B-_ArjjXPuj9AmZz9mG0IRGvptW0,2751
|
||||
flask/sessions.py,sha256=QBKXVYKJ-HKbx9m6Yb5yan_EPq84a5yevVLgAzNKFQY,14394
|
||||
flask/signals.py,sha256=MfZk5qTRj_R_O3aGYlTEnx2g3SvlZncz8Ii73eKK59g,2209
|
||||
flask/templating.py,sha256=u7FbN6j56H_q6CrdJJyJ6gZtqaMa0vh1_GP12gEHRQQ,4912
|
||||
flask/testing.py,sha256=II8EO_NjOT1LvL8Hh_SdIFL_BdlwVPcB9yot5pbltxE,5630
|
||||
flask/views.py,sha256=6OPv7gwu3h14JhqpeeMRWwrxoGHsUr4_nOGSyTRAxAI,5630
|
||||
flask/wrappers.py,sha256=1S_5mmuA1Tlx7D9lXV6xMblrg-PdAauNWahe-henMEE,7612
|
||||
flask/ext/__init__.py,sha256=UEezCApsG4ZJWqwUnX9YmWcNN4OVENgph_9L05n0eOM,842
|
||||
../../../bin/flask,sha256=1ow220Ff1jdiAk6Kq--IP8c1BYJdNqtYXFLTS5ul3yA,266
|
||||
Flask-0.12.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
flask/ext/__pycache__/__init__.cpython-36.pyc,,
|
||||
flask/__pycache__/blueprints.cpython-36.pyc,,
|
||||
flask/__pycache__/logging.cpython-36.pyc,,
|
||||
flask/__pycache__/sessions.cpython-36.pyc,,
|
||||
flask/__pycache__/templating.cpython-36.pyc,,
|
||||
flask/__pycache__/cli.cpython-36.pyc,,
|
||||
flask/__pycache__/config.cpython-36.pyc,,
|
||||
flask/__pycache__/signals.cpython-36.pyc,,
|
||||
flask/__pycache__/testing.cpython-36.pyc,,
|
||||
flask/__pycache__/views.cpython-36.pyc,,
|
||||
flask/__pycache__/ctx.cpython-36.pyc,,
|
||||
flask/__pycache__/app.cpython-36.pyc,,
|
||||
flask/__pycache__/exthook.cpython-36.pyc,,
|
||||
flask/__pycache__/__main__.cpython-36.pyc,,
|
||||
flask/__pycache__/_compat.cpython-36.pyc,,
|
||||
flask/__pycache__/helpers.cpython-36.pyc,,
|
||||
flask/__pycache__/wrappers.cpython-36.pyc,,
|
||||
flask/__pycache__/__init__.cpython-36.pyc,,
|
||||
flask/__pycache__/debughelpers.cpython-36.pyc,,
|
||||
flask/__pycache__/globals.cpython-36.pyc,,
|
||||
flask/__pycache__/json.cpython-36.pyc,,
|
|
@ -1,6 +0,0 @@
|
|||
Wheel-Version: 1.0
|
||||
Generator: bdist_wheel (0.29.0)
|
||||
Root-Is-Purelib: true
|
||||
Tag: py2-none-any
|
||||
Tag: py3-none-any
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
|
||||
[console_scripts]
|
||||
flask=flask.cli:main
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"classifiers": ["Development Status :: 4 - Beta", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules"], "extensions": {"python.commands": {"wrap_console": {"flask": "flask.cli:main"}}, "python.details": {"contacts": [{"email": "armin.ronacher@active-4.com", "name": "Armin Ronacher", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "http://github.com/pallets/flask/"}}, "python.exports": {"console_scripts": {"flask": "flask.cli:main"}}}, "extras": [], "generator": "bdist_wheel (0.29.0)", "license": "BSD", "metadata_version": "2.0", "name": "Flask", "platform": "any", "run_requires": [{"requires": ["Jinja2 (>=2.4)", "Werkzeug (>=0.7)", "click (>=2.0)", "itsdangerous (>=0.21)"]}], "summary": "A microframework based on Werkzeug, Jinja2 and good intentions", "version": "0.12.2"}
|
|
@ -1 +0,0 @@
|
|||
flask
|
|
@ -1,173 +0,0 @@
|
|||
# Flask-MQTT
|
||||
|
||||
Flask Extension for the [MQTT protocol][1]. Basically it is a thin wrapper
|
||||
around [paho-mqtt][0] and aimes to simplify MQTT integration in Flask. MQTT is a
|
||||
machine-to-machine "Internet of Things" protocol and was designed for extremely
|
||||
lightweight publish/subscribe messaging transport.
|
||||
|
||||
[![Documentation Status](https://readthedocs.org/projects/flask-mqtt/badge/?version=latest)](http://flask-mqtt.readthedocs.io/en/latest/?badge=latest) [![PyPI version](https://badge.fury.io/py/Flask-MQTT.svg)](https://badge.fury.io/py/Flask-MQTT) [![Travis CI](https://travis-ci.org/stlehmann/Flask-MQTT.svg?branch=master)](https://travis-ci.org/stlehmann/Flask-MQTT.svg?branch=master)
|
||||
|
||||
Find the documentation on [http://flask-mqtt.readthedocs.io][2].
|
||||
|
||||
## Features
|
||||
|
||||
* configuration via Flask config variables
|
||||
* auto-connect on start of your web application
|
||||
* publish and subscribe messages
|
||||
* use callbacks for certain topics
|
||||
* use one callback for all subscribed topics
|
||||
|
||||
## Installation
|
||||
|
||||
Simply install the package as usual via pip:
|
||||
|
||||
```bash
|
||||
$ pip install flask-mqtt
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Basic Setup
|
||||
|
||||
```python
|
||||
from flask import Flask
|
||||
from flask_mqtt import Mqtt
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['MQTT_BROKER_URL'] = 'mybroker.com'
|
||||
app.config['MQTT_BROKER_PORT'] = 1883
|
||||
app.config['MQTT_USERNAME'] = 'user'
|
||||
app.config['MQTT_PASSWORD'] = 'secret'
|
||||
app.config['MQTT_REFRESH_TIME'] = 1.0 # refresh time in seconds
|
||||
mqtt = Mqtt(app)
|
||||
|
||||
@app.route('/')
|
||||
def index():
|
||||
return render_template('index.html')
|
||||
|
||||
```
|
||||
|
||||
### Subscribe to a topic
|
||||
|
||||
To subscribe to a topic simply use `mqtt.subscribe()`. To make sure the
|
||||
subscription gets handled correctly on startup place the subscription inside
|
||||
an `on_connect()` callback function.
|
||||
|
||||
```python
|
||||
@mqtt.on_connect()
|
||||
def handle_connect(client, userdata, flags, rc):
|
||||
mqtt.subscribe('home/mytopic')
|
||||
```
|
||||
|
||||
To handle the subscribed messages you can define a handling function by
|
||||
decorating it with `@mqtt.on_message()`.
|
||||
|
||||
```python
|
||||
@mqtt.on_message()
|
||||
def handle_mqtt_message(client, userdata, message):
|
||||
data = dict(
|
||||
topic=message.topic,
|
||||
payload=message.payload.decode()
|
||||
)
|
||||
```
|
||||
|
||||
To unsubscribe do:
|
||||
|
||||
```python
|
||||
mqtt.unsubscribe('home/mytopic')
|
||||
```
|
||||
|
||||
Or if you want to unsubscribe all topics use `unsubscribe_all()`.
|
||||
|
||||
```python
|
||||
mqtt.unsubscribe_all()
|
||||
```
|
||||
|
||||
### Publish
|
||||
|
||||
To publish a message you can use the `publish()` method.
|
||||
|
||||
```python
|
||||
mqtt.publish('home/mytopic', 'this is my message')
|
||||
```
|
||||
|
||||
### Small publish/subscribe MQTT client
|
||||
|
||||
```python
|
||||
"""
|
||||
|
||||
A small Test application to show how to use Flask-MQTT.
|
||||
|
||||
"""
|
||||
|
||||
import eventlet
|
||||
import json
|
||||
from flask import Flask, render_template
|
||||
from flask_mqtt import Mqtt
|
||||
from flask_socketio import SocketIO
|
||||
from flask_bootstrap import Bootstrap
|
||||
|
||||
eventlet.monkey_patch()
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['SECRET'] = 'my secret key'
|
||||
app.config['TEMPLATES_AUTO_RELOAD'] = True
|
||||
app.config['MQTT_BROKER_URL'] = 'broker.hivemq.com'
|
||||
app.config['MQTT_BROKER_PORT'] = 1883
|
||||
app.config['MQTT_USERNAME'] = ''
|
||||
app.config['MQTT_PASSWORD'] = ''
|
||||
app.config['MQTT_KEEPALIVE'] = 5
|
||||
app.config['MQTT_TLS_ENABLED'] = False
|
||||
|
||||
# Parameters for SSL enabled
|
||||
# app.config['MQTT_BROKER_PORT'] = 8883
|
||||
# app.config['MQTT_TLS_ENABLED'] = True
|
||||
# app.config['MQTT_TLS_INSECURE'] = True
|
||||
# app.config['MQTT_TLS_CA_CERTS'] = 'ca.crt'
|
||||
|
||||
mqtt = Mqtt(app)
|
||||
socketio = SocketIO(app)
|
||||
bootstrap = Bootstrap(app)
|
||||
|
||||
|
||||
@app.route('/')
|
||||
def index():
|
||||
return render_template('index.html')
|
||||
|
||||
|
||||
@socketio.on('publish')
|
||||
def handle_publish(json_str):
|
||||
data = json.loads(json_str)
|
||||
mqtt.publish(data['topic'], data['message'])
|
||||
|
||||
|
||||
@socketio.on('subscribe')
|
||||
def handle_subscribe(json_str):
|
||||
data = json.loads(json_str)
|
||||
mqtt.subscribe(data['topic'])
|
||||
|
||||
|
||||
@mqtt.on_message()
|
||||
def handle_mqtt_message(client, userdata, message):
|
||||
data = dict(
|
||||
topic=message.topic,
|
||||
payload=message.payload.decode()
|
||||
)
|
||||
socketio.emit('mqtt_message', data=data)
|
||||
|
||||
|
||||
@mqtt.on_log()
|
||||
def handle_logging(client, userdata, level, buf):
|
||||
print(level, buf)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
socketio.run(app, host='0.0.0.0', port=5000, use_reloader=True, debug=True)
|
||||
|
||||
```
|
||||
|
||||
[0]: https://github.com/eclipse/paho.mqtt.python
|
||||
[1]: http://mqtt.org/
|
||||
[2]: http://flask-mqtt.readthedocs.io/en/latest/
|
||||
|
||||
|
|
@ -1 +0,0 @@
|
|||
pip
|
|
@ -1,194 +0,0 @@
|
|||
Metadata-Version: 2.0
|
||||
Name: Flask-MQTT
|
||||
Version: 1.0.3
|
||||
Summary: Flask extension for the MQTT protocol
|
||||
Home-page: https://github.com/MrLeeh/Flask-MQTT
|
||||
Author: Stefan Lehmann
|
||||
Author-email: stefan.st.lehmann@gmail.com
|
||||
License: MIT
|
||||
Platform: any
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Environment :: Web Environment
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: MIT License
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Description-Content-Type: text/markdown
|
||||
Requires-Dist: Flask
|
||||
Requires-Dist: typing
|
||||
Requires-Dist: paho-mqtt
|
||||
|
||||
# Flask-MQTT
|
||||
|
||||
Flask Extension for the [MQTT protocol][1]. Basically it is a thin wrapper
|
||||
around [paho-mqtt][0] and aimes to simplify MQTT integration in Flask. MQTT is a
|
||||
machine-to-machine "Internet of Things" protocol and was designed for extremely
|
||||
lightweight publish/subscribe messaging transport.
|
||||
|
||||
[![Documentation Status](https://readthedocs.org/projects/flask-mqtt/badge/?version=latest)](http://flask-mqtt.readthedocs.io/en/latest/?badge=latest) [![PyPI version](https://badge.fury.io/py/Flask-MQTT.svg)](https://badge.fury.io/py/Flask-MQTT) [![Travis CI](https://travis-ci.org/stlehmann/Flask-MQTT.svg?branch=master)](https://travis-ci.org/stlehmann/Flask-MQTT.svg?branch=master)
|
||||
|
||||
Find the documentation on [http://flask-mqtt.readthedocs.io][2].
|
||||
|
||||
## Features
|
||||
|
||||
* configuration via Flask config variables
|
||||
* auto-connect on start of your web application
|
||||
* publish and subscribe messages
|
||||
* use callbacks for certain topics
|
||||
* use one callback for all subscribed topics
|
||||
|
||||
## Installation
|
||||
|
||||
Simply install the package as usual via pip:
|
||||
|
||||
```bash
|
||||
$ pip install flask-mqtt
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Basic Setup
|
||||
|
||||
```python
|
||||
from flask import Flask
|
||||
from flask_mqtt import Mqtt
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['MQTT_BROKER_URL'] = 'mybroker.com'
|
||||
app.config['MQTT_BROKER_PORT'] = 1883
|
||||
app.config['MQTT_USERNAME'] = 'user'
|
||||
app.config['MQTT_PASSWORD'] = 'secret'
|
||||
app.config['MQTT_REFRESH_TIME'] = 1.0 # refresh time in seconds
|
||||
mqtt = Mqtt(app)
|
||||
|
||||
@app.route('/')
|
||||
def index():
|
||||
return render_template('index.html')
|
||||
|
||||
```
|
||||
|
||||
### Subscribe to a topic
|
||||
|
||||
To subscribe to a topic simply use `mqtt.subscribe()`. To make sure the
|
||||
subscription gets handled correctly on startup place the subscription inside
|
||||
an `on_connect()` callback function.
|
||||
|
||||
```python
|
||||
@mqtt.on_connect()
|
||||
def handle_connect(client, userdata, flags, rc):
|
||||
mqtt.subscribe('home/mytopic')
|
||||
```
|
||||
|
||||
To handle the subscribed messages you can define a handling function by
|
||||
decorating it with `@mqtt.on_message()`.
|
||||
|
||||
```python
|
||||
@mqtt.on_message()
|
||||
def handle_mqtt_message(client, userdata, message):
|
||||
data = dict(
|
||||
topic=message.topic,
|
||||
payload=message.payload.decode()
|
||||
)
|
||||
```
|
||||
|
||||
To unsubscribe do:
|
||||
|
||||
```python
|
||||
mqtt.unsubscribe('home/mytopic')
|
||||
```
|
||||
|
||||
Or if you want to unsubscribe all topics use `unsubscribe_all()`.
|
||||
|
||||
```python
|
||||
mqtt.unsubscribe_all()
|
||||
```
|
||||
|
||||
### Publish
|
||||
|
||||
To publish a message you can use the `publish()` method.
|
||||
|
||||
```python
|
||||
mqtt.publish('home/mytopic', 'this is my message')
|
||||
```
|
||||
|
||||
### Small publish/subscribe MQTT client
|
||||
|
||||
```python
|
||||
"""
|
||||
|
||||
A small Test application to show how to use Flask-MQTT.
|
||||
|
||||
"""
|
||||
|
||||
import eventlet
|
||||
import json
|
||||
from flask import Flask, render_template
|
||||
from flask_mqtt import Mqtt
|
||||
from flask_socketio import SocketIO
|
||||
from flask_bootstrap import Bootstrap
|
||||
|
||||
eventlet.monkey_patch()
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['SECRET'] = 'my secret key'
|
||||
app.config['TEMPLATES_AUTO_RELOAD'] = True
|
||||
app.config['MQTT_BROKER_URL'] = 'broker.hivemq.com'
|
||||
app.config['MQTT_BROKER_PORT'] = 1883
|
||||
app.config['MQTT_USERNAME'] = ''
|
||||
app.config['MQTT_PASSWORD'] = ''
|
||||
app.config['MQTT_KEEPALIVE'] = 5
|
||||
app.config['MQTT_TLS_ENABLED'] = False
|
||||
|
||||
# Parameters for SSL enabled
|
||||
# app.config['MQTT_BROKER_PORT'] = 8883
|
||||
# app.config['MQTT_TLS_ENABLED'] = True
|
||||
# app.config['MQTT_TLS_INSECURE'] = True
|
||||
# app.config['MQTT_TLS_CA_CERTS'] = 'ca.crt'
|
||||
|
||||
mqtt = Mqtt(app)
|
||||
socketio = SocketIO(app)
|
||||
bootstrap = Bootstrap(app)
|
||||
|
||||
|
||||
@app.route('/')
|
||||
def index():
|
||||
return render_template('index.html')
|
||||
|
||||
|
||||
@socketio.on('publish')
|
||||
def handle_publish(json_str):
|
||||
data = json.loads(json_str)
|
||||
mqtt.publish(data['topic'], data['message'])
|
||||
|
||||
|
||||
@socketio.on('subscribe')
|
||||
def handle_subscribe(json_str):
|
||||
data = json.loads(json_str)
|
||||
mqtt.subscribe(data['topic'])
|
||||
|
||||
|
||||
@mqtt.on_message()
|
||||
def handle_mqtt_message(client, userdata, message):
|
||||
data = dict(
|
||||
topic=message.topic,
|
||||
payload=message.payload.decode()
|
||||
)
|
||||
socketio.emit('mqtt_message', data=data)
|
||||
|
||||
|
||||
@mqtt.on_log()
|
||||
def handle_logging(client, userdata, level, buf):
|
||||
print(level, buf)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
socketio.run(app, host='0.0.0.0', port=5000, use_reloader=True, debug=True)
|
||||
|
||||
```
|
||||
|
||||
[0]: https://github.com/eclipse/paho.mqtt.python
|
||||
[1]: http://mqtt.org/
|
||||
[2]: http://flask-mqtt.readthedocs.io/en/latest/
|
||||
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
Flask_MQTT-1.0.3.dist-info/DESCRIPTION.rst,sha256=scdzeVK9SyGF_ZYEjSy07Lvbkx3VKOH5KwRt8oNRx7s,4225
|
||||
Flask_MQTT-1.0.3.dist-info/METADATA,sha256=Sz1g2z9KQFIaAlv4kh2ga0sCeX2GbQb2PAnlyYcKt94,4946
|
||||
Flask_MQTT-1.0.3.dist-info/RECORD,,
|
||||
Flask_MQTT-1.0.3.dist-info/WHEEL,sha256=0mO7-aKM6K9CHeURc5NDYZyLWH5lmR-r4TtPinHxz7Y,93
|
||||
Flask_MQTT-1.0.3.dist-info/metadata.json,sha256=8k4mdFdGj0w-NXl0Q3hK4CX4B0fiqDu-GzTakg9HlQc,901
|
||||
Flask_MQTT-1.0.3.dist-info/top_level.txt,sha256=rDSXoP_WPnaqCmGIyZOn1ieidQ63URSSX4KvlN3HzL8,11
|
||||
flask_mqtt/__init__.py,sha256=SAbjc3stsoQIxpD8IfS__mqSNxgZNhtBo2W4Xn7A2Bg,13391
|
||||
Flask_MQTT-1.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
flask_mqtt/__pycache__/__init__.cpython-36.pyc,,
|
|
@ -1,5 +0,0 @@
|
|||
Wheel-Version: 1.0
|
||||
Generator: bdist_wheel (0.30.0)
|
||||
Root-Is-Purelib: true
|
||||
Tag: cp36-none-any
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules"], "description_content_type": "text/markdown", "extensions": {"python.details": {"contacts": [{"email": "stefan.st.lehmann@gmail.com", "name": "Stefan Lehmann", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/MrLeeh/Flask-MQTT"}}}, "extras": [], "generator": "bdist_wheel (0.30.0)", "license": "MIT", "metadata_version": "2.0", "name": "Flask-MQTT", "platform": "any", "run_requires": [{"requires": ["Flask", "paho-mqtt", "typing"]}], "summary": "Flask extension for the MQTT protocol", "version": "1.0.3"}
|
|
@ -1 +0,0 @@
|
|||
flask_mqtt
|
|
@ -1,15 +0,0 @@
|
|||
|
||||
Flask-SQLAlchemy
|
||||
----------------
|
||||
|
||||
Adds SQLAlchemy support to your Flask application.
|
||||
|
||||
Links
|
||||
`````
|
||||
|
||||
* `documentation <http://flask-sqlalchemy.pocoo.org>`_
|
||||
* `development version
|
||||
<http://github.com/mitsuhiko/flask-sqlalchemy/zipball/master#egg=Flask-SQLAlchemy-dev>`_
|
||||
|
||||
|
||||
|
|
@ -1 +0,0 @@
|
|||
pip
|
|
@ -1,31 +0,0 @@
|
|||
Copyright (c) 2014 by Armin Ronacher.
|
||||
|
||||
Some rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
|
||||
* The names of the contributors may not be used to endorse or
|
||||
promote products derived from this software without specific
|
||||
prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@ -1,43 +0,0 @@
|
|||
Metadata-Version: 2.0
|
||||
Name: Flask-SQLAlchemy
|
||||
Version: 2.3.2
|
||||
Summary: Adds SQLAlchemy support to your Flask application
|
||||
Home-page: http://github.com/mitsuhiko/flask-sqlalchemy
|
||||
Author: Phil Howell
|
||||
Author-email: phil@quae.co.uk
|
||||
License: BSD
|
||||
Description-Content-Type: UNKNOWN
|
||||
Platform: any
|
||||
Classifier: Environment :: Web Environment
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: BSD License
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 2
|
||||
Classifier: Programming Language :: Python :: 2.6
|
||||
Classifier: Programming Language :: Python :: 2.7
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.3
|
||||
Classifier: Programming Language :: Python :: 3.4
|
||||
Classifier: Programming Language :: Python :: 3.5
|
||||
Classifier: Programming Language :: Python :: 3.6
|
||||
Requires-Dist: Flask (>=0.10)
|
||||
Requires-Dist: SQLAlchemy (>=0.8.0)
|
||||
|
||||
|
||||
Flask-SQLAlchemy
|
||||
----------------
|
||||
|
||||
Adds SQLAlchemy support to your Flask application.
|
||||
|
||||
Links
|
||||
`````
|
||||
|
||||
* `documentation <http://flask-sqlalchemy.pocoo.org>`_
|
||||
* `development version
|
||||
<http://github.com/mitsuhiko/flask-sqlalchemy/zipball/master#egg=Flask-SQLAlchemy-dev>`_
|
||||
|
||||
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
Flask_SQLAlchemy-2.3.2.dist-info/DESCRIPTION.rst,sha256=Mp4bpckSjf082xflOARFwzWLTnUszq7JxcY0dR9vD2w,273
|
||||
Flask_SQLAlchemy-2.3.2.dist-info/LICENSE.txt,sha256=2smrI3hNiP6c5TcX0fa6fqODgsdJVLC166X0kVxei9A,1457
|
||||
Flask_SQLAlchemy-2.3.2.dist-info/METADATA,sha256=iDXuOIujwz5MXBrH-I4WsW7kLKsY07feI7hggFHFfEk,1384
|
||||
Flask_SQLAlchemy-2.3.2.dist-info/RECORD,,
|
||||
Flask_SQLAlchemy-2.3.2.dist-info/WHEEL,sha256=kdsN-5OJAZIiHN-iO4Rhl82KyS0bDWf4uBwMbkNafr8,110
|
||||
Flask_SQLAlchemy-2.3.2.dist-info/metadata.json,sha256=VOw756wP14azHrBwNxHIfbYkK4DkEPrCaV6Kf0VO36E,1257
|
||||
Flask_SQLAlchemy-2.3.2.dist-info/top_level.txt,sha256=w2K4fNNoTh4HItoFfz2FRQShSeLcvHYrzU_sZov21QU,17
|
||||
flask_sqlalchemy/__init__.py,sha256=0ZyibSbbC_Q1x8Kemp_2s2-NCowd_-CRvLyE1dPfnvw,35991
|
||||
flask_sqlalchemy/_compat.py,sha256=6rFcZZ3kxvyeJUC_FyB62mG1saNU8iQthzWHLDcKPVE,1057
|
||||
flask_sqlalchemy/model.py,sha256=7CTvGxxKmLscwcwq9mVT5ny_w301QZvTVjSqMoMx6DI,4974
|
||||
Flask_SQLAlchemy-2.3.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
flask_sqlalchemy/__pycache__/model.cpython-36.pyc,,
|
||||
flask_sqlalchemy/__pycache__/_compat.cpython-36.pyc,,
|
||||
flask_sqlalchemy/__pycache__/__init__.cpython-36.pyc,,
|
|
@ -1,6 +0,0 @@
|
|||
Wheel-Version: 1.0
|
||||
Generator: bdist_wheel (0.30.0)
|
||||
Root-Is-Purelib: true
|
||||
Tag: py2-none-any
|
||||
Tag: py3-none-any
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"classifiers": ["Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6"], "description_content_type": "UNKNOWN", "extensions": {"python.details": {"contacts": [{"email": "phil@quae.co.uk", "name": "Phil Howell", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "http://github.com/mitsuhiko/flask-sqlalchemy"}}}, "extras": [], "generator": "bdist_wheel (0.30.0)", "license": "BSD", "metadata_version": "2.0", "name": "Flask-SQLAlchemy", "platform": "any", "run_requires": [{"requires": ["Flask (>=0.10)", "SQLAlchemy (>=0.8.0)"]}], "summary": "Adds SQLAlchemy support to your Flask application", "version": "2.3.2"}
|
|
@ -1 +0,0 @@
|
|||
flask_sqlalchemy
|
|
@ -1,37 +0,0 @@
|
|||
|
||||
Jinja2
|
||||
~~~~~~
|
||||
|
||||
Jinja2 is a template engine written in pure Python. It provides a
|
||||
`Django`_ inspired non-XML syntax but supports inline expressions and
|
||||
an optional `sandboxed`_ environment.
|
||||
|
||||
Nutshell
|
||||
--------
|
||||
|
||||
Here a small example of a Jinja template::
|
||||
|
||||
{% extends 'base.html' %}
|
||||
{% block title %}Memberlist{% endblock %}
|
||||
{% block content %}
|
||||
<ul>
|
||||
{% for user in users %}
|
||||
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
Philosophy
|
||||
----------
|
||||
|
||||
Application logic is for the controller but don't try to make the life
|
||||
for the template designer too hard by giving him too few functionality.
|
||||
|
||||
For more informations visit the new `Jinja2 webpage`_ and `documentation`_.
|
||||
|
||||
.. _sandboxed: https://en.wikipedia.org/wiki/Sandbox_(computer_security)
|
||||
.. _Django: https://www.djangoproject.com/
|
||||
.. _Jinja2 webpage: http://jinja.pocoo.org/
|
||||
.. _documentation: http://jinja.pocoo.org/2/documentation/
|
||||
|
||||
|
|
@ -1 +0,0 @@
|
|||
pip
|
|
@ -1,31 +0,0 @@
|
|||
Copyright (c) 2009 by the Jinja Team, see AUTHORS for more details.
|
||||
|
||||
Some rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
|
||||
* The names of the contributors may not be used to endorse or
|
||||
promote products derived from this software without specific
|
||||
prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@ -1,68 +0,0 @@
|
|||
Metadata-Version: 2.0
|
||||
Name: Jinja2
|
||||
Version: 2.10
|
||||
Summary: A small but fast and easy to use stand-alone template engine written in pure python.
|
||||
Home-page: http://jinja.pocoo.org/
|
||||
Author: Armin Ronacher
|
||||
Author-email: armin.ronacher@active-4.com
|
||||
License: BSD
|
||||
Description-Content-Type: UNKNOWN
|
||||
Platform: UNKNOWN
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Environment :: Web Environment
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: BSD License
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 2
|
||||
Classifier: Programming Language :: Python :: 2.6
|
||||
Classifier: Programming Language :: Python :: 2.7
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.3
|
||||
Classifier: Programming Language :: Python :: 3.4
|
||||
Classifier: Programming Language :: Python :: 3.5
|
||||
Classifier: Programming Language :: Python :: 3.6
|
||||
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Classifier: Topic :: Text Processing :: Markup :: HTML
|
||||
Requires-Dist: MarkupSafe (>=0.23)
|
||||
Provides-Extra: i18n
|
||||
Requires-Dist: Babel (>=0.8); extra == 'i18n'
|
||||
|
||||
|
||||
Jinja2
|
||||
~~~~~~
|
||||
|
||||
Jinja2 is a template engine written in pure Python. It provides a
|
||||
`Django`_ inspired non-XML syntax but supports inline expressions and
|
||||
an optional `sandboxed`_ environment.
|
||||
|
||||
Nutshell
|
||||
--------
|
||||
|
||||
Here a small example of a Jinja template::
|
||||
|
||||
{% extends 'base.html' %}
|
||||
{% block title %}Memberlist{% endblock %}
|
||||
{% block content %}
|
||||
<ul>
|
||||
{% for user in users %}
|
||||
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
Philosophy
|
||||
----------
|
||||
|
||||
Application logic is for the controller but don't try to make the life
|
||||
for the template designer too hard by giving him too few functionality.
|
||||
|
||||
For more informations visit the new `Jinja2 webpage`_ and `documentation`_.
|
||||
|
||||
.. _sandboxed: https://en.wikipedia.org/wiki/Sandbox_(computer_security)
|
||||
.. _Django: https://www.djangoproject.com/
|
||||
.. _Jinja2 webpage: http://jinja.pocoo.org/
|
||||
.. _documentation: http://jinja.pocoo.org/2/documentation/
|
||||
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
Jinja2-2.10.dist-info/DESCRIPTION.rst,sha256=b5ckFDoM7vVtz_mAsJD4OPteFKCqE7beu353g4COoYI,978
|
||||
Jinja2-2.10.dist-info/LICENSE.txt,sha256=JvzUNv3Io51EiWrAPm8d_SXjhJnEjyDYvB3Tvwqqils,1554
|
||||
Jinja2-2.10.dist-info/METADATA,sha256=18EgU8zR6-av-0-5y_gXebzK4GnBB_76lALUsl-6QHM,2258
|
||||
Jinja2-2.10.dist-info/RECORD,,
|
||||
Jinja2-2.10.dist-info/WHEEL,sha256=kdsN-5OJAZIiHN-iO4Rhl82KyS0bDWf4uBwMbkNafr8,110
|
||||
Jinja2-2.10.dist-info/entry_points.txt,sha256=NdzVcOrqyNyKDxD09aERj__3bFx2paZhizFDsKmVhiA,72
|
||||
Jinja2-2.10.dist-info/metadata.json,sha256=NPUJ9TMBxVQAv_kTJzvU8HwmP-4XZvbK9mz6_4YUVl4,1473
|
||||
Jinja2-2.10.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7
|
||||
jinja2/__init__.py,sha256=xJHjaMoy51_KXn1wf0cysH6tUUifUxZCwSOfcJGEYZw,2614
|
||||
jinja2/_compat.py,sha256=xP60CE5Qr8FTYcDE1f54tbZLKGvMwYml4-8T7Q4KG9k,2596
|
||||
jinja2/_identifier.py,sha256=W1QBSY-iJsyt6oR_nKSuNNCzV95vLIOYgUNPUI1d5gU,1726
|
||||
jinja2/asyncfilters.py,sha256=cTDPvrS8Hp_IkwsZ1m9af_lr5nHysw7uTa5gV0NmZVE,4144
|
||||
jinja2/asyncsupport.py,sha256=UErQ3YlTLaSjFb94P4MVn08-aVD9jJxty2JVfMRb-1M,7878
|
||||
jinja2/bccache.py,sha256=nQldx0ZRYANMyfvOihRoYFKSlUdd5vJkS7BjxNwlOZM,12794
|
||||
jinja2/compiler.py,sha256=BqC5U6JxObSRhblyT_a6Tp5GtEU5z3US1a4jLQaxxgo,65386
|
||||
jinja2/constants.py,sha256=uwwV8ZUhHhacAuz5PTwckfsbqBaqM7aKfyJL7kGX5YQ,1626
|
||||
jinja2/debug.py,sha256=WTVeUFGUa4v6ReCsYv-iVPa3pkNB75OinJt3PfxNdXs,12045
|
||||
jinja2/defaults.py,sha256=Em-95hmsJxIenDCZFB1YSvf9CNhe9rBmytN3yUrBcWA,1400
|
||||
jinja2/environment.py,sha256=VnkAkqw8JbjZct4tAyHlpBrka2vqB-Z58RAP-32P1ZY,50849
|
||||
jinja2/exceptions.py,sha256=_Rj-NVi98Q6AiEjYQOsP8dEIdu5AlmRHzcSNOPdWix4,4428
|
||||
jinja2/ext.py,sha256=atMQydEC86tN1zUsdQiHw5L5cF62nDbqGue25Yiu3N4,24500
|
||||
jinja2/filters.py,sha256=yOAJk0MsH-_gEC0i0U6NweVQhbtYaC-uE8xswHFLF4w,36528
|
||||
jinja2/idtracking.py,sha256=2GbDSzIvGArEBGLkovLkqEfmYxmWsEf8c3QZwM4uNsw,9197
|
||||
jinja2/lexer.py,sha256=ySEPoXd1g7wRjsuw23uimS6nkGN5aqrYwcOKxCaVMBQ,28559
|
||||
jinja2/loaders.py,sha256=xiTuURKAEObyym0nU8PCIXu_Qp8fn0AJ5oIADUUm-5Q,17382
|
||||
jinja2/meta.py,sha256=fmKHxkmZYAOm9QyWWy8EMd6eefAIh234rkBMW2X4ZR8,4340
|
||||
jinja2/nativetypes.py,sha256=_sJhS8f-8Q0QMIC0dm1YEdLyxEyoO-kch8qOL5xUDfE,7308
|
||||
jinja2/nodes.py,sha256=L10L_nQDfubLhO3XjpF9qz46FSh2clL-3e49ogVlMmA,30853
|
||||
jinja2/optimizer.py,sha256=MsdlFACJ0FRdPtjmCAdt7JQ9SGrXFaDNUaslsWQaG3M,1722
|
||||
jinja2/parser.py,sha256=lPzTEbcpTRBLw8ii6OYyExHeAhaZLMA05Hpv4ll3ULk,35875
|
||||
jinja2/runtime.py,sha256=DHdD38Pq8gj7uWQC5usJyWFoNWL317A9AvXOW_CLB34,27755
|
||||
jinja2/sandbox.py,sha256=TVyZHlNqqTzsv9fv2NvJNmSdWRHTguhyMHdxjWms32U,16708
|
||||
jinja2/tests.py,sha256=iJQLwbapZr-EKquTG_fVOVdwHUUKf3SX9eNkjQDF8oU,4237
|
||||
jinja2/utils.py,sha256=q24VupGZotQ-uOyrJxCaXtDWhZC1RgsQG7kcdmjck2Q,20629
|
||||
jinja2/visitor.py,sha256=JD1H1cANA29JcntFfN5fPyqQxB4bI4wC00BzZa-XHks,3316
|
||||
Jinja2-2.10.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
jinja2/__pycache__/lexer.cpython-36.pyc,,
|
||||
jinja2/__pycache__/sandbox.cpython-36.pyc,,
|
||||
jinja2/__pycache__/debug.cpython-36.pyc,,
|
||||
jinja2/__pycache__/constants.cpython-36.pyc,,
|
||||
jinja2/__pycache__/idtracking.cpython-36.pyc,,
|
||||
jinja2/__pycache__/parser.cpython-36.pyc,,
|
||||
jinja2/__pycache__/exceptions.cpython-36.pyc,,
|
||||
jinja2/__pycache__/ext.cpython-36.pyc,,
|
||||
jinja2/__pycache__/meta.cpython-36.pyc,,
|
||||
jinja2/__pycache__/environment.cpython-36.pyc,,
|
||||
jinja2/__pycache__/loaders.cpython-36.pyc,,
|
||||
jinja2/__pycache__/asyncsupport.cpython-36.pyc,,
|
||||
jinja2/__pycache__/asyncfilters.cpython-36.pyc,,
|
||||
jinja2/__pycache__/tests.cpython-36.pyc,,
|
||||
jinja2/__pycache__/optimizer.cpython-36.pyc,,
|
||||
jinja2/__pycache__/compiler.cpython-36.pyc,,
|
||||
jinja2/__pycache__/bccache.cpython-36.pyc,,
|
||||
jinja2/__pycache__/_identifier.cpython-36.pyc,,
|
||||
jinja2/__pycache__/_compat.cpython-36.pyc,,
|
||||
jinja2/__pycache__/defaults.cpython-36.pyc,,
|
||||
jinja2/__pycache__/utils.cpython-36.pyc,,
|
||||
jinja2/__pycache__/nodes.cpython-36.pyc,,
|
||||
jinja2/__pycache__/filters.cpython-36.pyc,,
|
||||
jinja2/__pycache__/runtime.cpython-36.pyc,,
|
||||
jinja2/__pycache__/__init__.cpython-36.pyc,,
|
||||
jinja2/__pycache__/nativetypes.cpython-36.pyc,,
|
||||
jinja2/__pycache__/visitor.cpython-36.pyc,,
|
|
@ -1,6 +0,0 @@
|
|||
Wheel-Version: 1.0
|
||||
Generator: bdist_wheel (0.30.0)
|
||||
Root-Is-Purelib: true
|
||||
Tag: py2-none-any
|
||||
Tag: py3-none-any
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
|
||||
[babel.extractors]
|
||||
jinja2 = jinja2.ext:babel_extract[i18n]
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Markup :: HTML"], "description_content_type": "UNKNOWN", "extensions": {"python.details": {"contacts": [{"email": "armin.ronacher@active-4.com", "name": "Armin Ronacher", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "http://jinja.pocoo.org/"}}, "python.exports": {"babel.extractors": {"jinja2": "jinja2.ext:babel_extract [i18n]"}}}, "extras": ["i18n"], "generator": "bdist_wheel (0.30.0)", "license": "BSD", "metadata_version": "2.0", "name": "Jinja2", "run_requires": [{"extra": "i18n", "requires": ["Babel (>=0.8)"]}, {"requires": ["MarkupSafe (>=0.23)"]}], "summary": "A small but fast and easy to use stand-alone template engine written in pure python.", "version": "2.10"}
|
|
@ -1 +0,0 @@
|
|||
jinja2
|
|
@ -1,115 +0,0 @@
|
|||
MarkupSafe
|
||||
==========
|
||||
|
||||
Implements a unicode subclass that supports HTML strings:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
>>> from markupsafe import Markup, escape
|
||||
>>> escape("<script>alert(document.cookie);</script>")
|
||||
Markup(u'<script>alert(document.cookie);</script>')
|
||||
>>> tmpl = Markup("<em>%s</em>")
|
||||
>>> tmpl % "Peter > Lustig"
|
||||
Markup(u'<em>Peter > Lustig</em>')
|
||||
|
||||
If you want to make an object unicode that is not yet unicode
|
||||
but don't want to lose the taint information, you can use the
|
||||
``soft_unicode`` function. (On Python 3 you can also use ``soft_str`` which
|
||||
is a different name for the same function).
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
>>> from markupsafe import soft_unicode
|
||||
>>> soft_unicode(42)
|
||||
u'42'
|
||||
>>> soft_unicode(Markup('foo'))
|
||||
Markup(u'foo')
|
||||
|
||||
HTML Representations
|
||||
--------------------
|
||||
|
||||
Objects can customize their HTML markup equivalent by overriding
|
||||
the ``__html__`` function:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
>>> class Foo(object):
|
||||
... def __html__(self):
|
||||
... return '<strong>Nice</strong>'
|
||||
...
|
||||
>>> escape(Foo())
|
||||
Markup(u'<strong>Nice</strong>')
|
||||
>>> Markup(Foo())
|
||||
Markup(u'<strong>Nice</strong>')
|
||||
|
||||
Silent Escapes
|
||||
--------------
|
||||
|
||||
Since MarkupSafe 0.10 there is now also a separate escape function
|
||||
called ``escape_silent`` that returns an empty string for ``None`` for
|
||||
consistency with other systems that return empty strings for ``None``
|
||||
when escaping (for instance Pylons' webhelpers).
|
||||
|
||||
If you also want to use this for the escape method of the Markup
|
||||
object, you can create your own subclass that does that:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from markupsafe import Markup, escape_silent as escape
|
||||
|
||||
class SilentMarkup(Markup):
|
||||
__slots__ = ()
|
||||
|
||||
@classmethod
|
||||
def escape(cls, s):
|
||||
return cls(escape(s))
|
||||
|
||||
New-Style String Formatting
|
||||
---------------------------
|
||||
|
||||
Starting with MarkupSafe 0.21 new style string formats from Python 2.6 and
|
||||
3.x are now fully supported. Previously the escape behavior of those
|
||||
functions was spotty at best. The new implementations operates under the
|
||||
following algorithm:
|
||||
|
||||
1. if an object has an ``__html_format__`` method it is called as
|
||||
replacement for ``__format__`` with the format specifier. It either
|
||||
has to return a string or markup object.
|
||||
2. if an object has an ``__html__`` method it is called.
|
||||
3. otherwise the default format system of Python kicks in and the result
|
||||
is HTML escaped.
|
||||
|
||||
Here is how you can implement your own formatting:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class User(object):
|
||||
|
||||
def __init__(self, id, username):
|
||||
self.id = id
|
||||
self.username = username
|
||||
|
||||
def __html_format__(self, format_spec):
|
||||
if format_spec == 'link':
|
||||
return Markup('<a href="/user/{0}">{1}</a>').format(
|
||||
self.id,
|
||||
self.__html__(),
|
||||
)
|
||||
elif format_spec:
|
||||
raise ValueError('Invalid format spec')
|
||||
return self.__html__()
|
||||
|
||||
def __html__(self):
|
||||
return Markup('<span class=user>{0}</span>').format(self.username)
|
||||
|
||||
And to format that user:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
>>> user = User(1, 'foo')
|
||||
>>> Markup('<p>User: {0:link}').format(user)
|
||||
Markup(u'<p>User: <a href="/user/1"><span class=user>foo</span></a>')
|
||||
|
||||
Markupsafe supports Python 2.6, 2.7 and Python 3.3 and higher.
|
||||
|
||||
|
|
@ -1 +0,0 @@
|
|||
pip
|
|
@ -1,33 +0,0 @@
|
|||
Copyright (c) 2010 by Armin Ronacher and contributors. See AUTHORS
|
||||
for more details.
|
||||
|
||||
Some rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms of the software as well
|
||||
as documentation, with or without modification, are permitted provided
|
||||
that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
|
||||
* The names of the contributors may not be used to endorse or
|
||||
promote products derived from this software without specific
|
||||
prior written permission.
|
||||
|
||||
THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
|
||||
NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGE.
|
|
@ -1,135 +0,0 @@
|
|||
Metadata-Version: 2.0
|
||||
Name: MarkupSafe
|
||||
Version: 1.0
|
||||
Summary: Implements a XML/HTML/XHTML Markup safe string for Python
|
||||
Home-page: http://github.com/pallets/markupsafe
|
||||
Author: Armin Ronacher
|
||||
Author-email: armin.ronacher@active-4.com
|
||||
License: BSD
|
||||
Platform: UNKNOWN
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Environment :: Web Environment
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: BSD License
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Classifier: Topic :: Text Processing :: Markup :: HTML
|
||||
|
||||
MarkupSafe
|
||||
==========
|
||||
|
||||
Implements a unicode subclass that supports HTML strings:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
>>> from markupsafe import Markup, escape
|
||||
>>> escape("<script>alert(document.cookie);</script>")
|
||||
Markup(u'<script>alert(document.cookie);</script>')
|
||||
>>> tmpl = Markup("<em>%s</em>")
|
||||
>>> tmpl % "Peter > Lustig"
|
||||
Markup(u'<em>Peter > Lustig</em>')
|
||||
|
||||
If you want to make an object unicode that is not yet unicode
|
||||
but don't want to lose the taint information, you can use the
|
||||
``soft_unicode`` function. (On Python 3 you can also use ``soft_str`` which
|
||||
is a different name for the same function).
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
>>> from markupsafe import soft_unicode
|
||||
>>> soft_unicode(42)
|
||||
u'42'
|
||||
>>> soft_unicode(Markup('foo'))
|
||||
Markup(u'foo')
|
||||
|
||||
HTML Representations
|
||||
--------------------
|
||||
|
||||
Objects can customize their HTML markup equivalent by overriding
|
||||
the ``__html__`` function:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
>>> class Foo(object):
|
||||
... def __html__(self):
|
||||
... return '<strong>Nice</strong>'
|
||||
...
|
||||
>>> escape(Foo())
|
||||
Markup(u'<strong>Nice</strong>')
|
||||
>>> Markup(Foo())
|
||||
Markup(u'<strong>Nice</strong>')
|
||||
|
||||
Silent Escapes
|
||||
--------------
|
||||
|
||||
Since MarkupSafe 0.10 there is now also a separate escape function
|
||||
called ``escape_silent`` that returns an empty string for ``None`` for
|
||||
consistency with other systems that return empty strings for ``None``
|
||||
when escaping (for instance Pylons' webhelpers).
|
||||
|
||||
If you also want to use this for the escape method of the Markup
|
||||
object, you can create your own subclass that does that:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from markupsafe import Markup, escape_silent as escape
|
||||
|
||||
class SilentMarkup(Markup):
|
||||
__slots__ = ()
|
||||
|
||||
@classmethod
|
||||
def escape(cls, s):
|
||||
return cls(escape(s))
|
||||
|
||||
New-Style String Formatting
|
||||
---------------------------
|
||||
|
||||
Starting with MarkupSafe 0.21 new style string formats from Python 2.6 and
|
||||
3.x are now fully supported. Previously the escape behavior of those
|
||||
functions was spotty at best. The new implementations operates under the
|
||||
following algorithm:
|
||||
|
||||
1. if an object has an ``__html_format__`` method it is called as
|
||||
replacement for ``__format__`` with the format specifier. It either
|
||||
has to return a string or markup object.
|
||||
2. if an object has an ``__html__`` method it is called.
|
||||
3. otherwise the default format system of Python kicks in and the result
|
||||
is HTML escaped.
|
||||
|
||||
Here is how you can implement your own formatting:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class User(object):
|
||||
|
||||
def __init__(self, id, username):
|
||||
self.id = id
|
||||
self.username = username
|
||||
|
||||
def __html_format__(self, format_spec):
|
||||
if format_spec == 'link':
|
||||
return Markup('<a href="/user/{0}">{1}</a>').format(
|
||||
self.id,
|
||||
self.__html__(),
|
||||
)
|
||||
elif format_spec:
|
||||
raise ValueError('Invalid format spec')
|
||||
return self.__html__()
|
||||
|
||||
def __html__(self):
|
||||
return Markup('<span class=user>{0}</span>').format(self.username)
|
||||
|
||||
And to format that user:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
>>> user = User(1, 'foo')
|
||||
>>> Markup('<p>User: {0:link}').format(user)
|
||||
Markup(u'<p>User: <a href="/user/1"><span class=user>foo</span></a>')
|
||||
|
||||
Markupsafe supports Python 2.6, 2.7 and Python 3.3 and higher.
|
||||
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
MarkupSafe-1.0.dist-info/DESCRIPTION.rst,sha256=3B3J0YLzzmJQVaWQ_XlVMhGeHA_DvBqysABvul_5fko,3397
|
||||
MarkupSafe-1.0.dist-info/LICENSE.txt,sha256=C76IIo_WPSDsCX9k5Y1aCkZRI64TkUChjUBsYLSIJLU,1582
|
||||
MarkupSafe-1.0.dist-info/METADATA,sha256=EUwvRzJbtRP3hBMc8Z2TDT44TBDeZdIurbGzIc7FOkg,4182
|
||||
MarkupSafe-1.0.dist-info/RECORD,,
|
||||
MarkupSafe-1.0.dist-info/WHEEL,sha256=t7v9jPyHKppZusl3DelaV4cYxaKjc-YJ3uQtEMT8OaQ,111
|
||||
MarkupSafe-1.0.dist-info/metadata.json,sha256=LPb3W7qq-SH_u1SFzjXQqT8sCGpE-b4NmYAxMcw91e8,924
|
||||
MarkupSafe-1.0.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11
|
||||
markupsafe/__init__.py,sha256=xtkRdxhzJzgp65wUo1D4DjnazxHU88pPldaAuDekBeY,10697
|
||||
markupsafe/_compat.py,sha256=r1HE0CpcAZeb-AiTV9wITR91PeLHn0CzZ_XHkYoozpI,565
|
||||
markupsafe/_constants.py,sha256=U_xybFQsyXKCgHSfranJnFzo-z9nn9fuBeSk243sE5Q,4795
|
||||
markupsafe/_native.py,sha256=E2Un1ysOf-w45d18YCj8UelT5UP7Vt__IuFPYJ7YRIs,1187
|
||||
markupsafe/_speedups.c,sha256=B6Mf6Fn33WqkagfwY7q5ZBSm_vJoHDYxDB0Jp_DP7Jw,5936
|
||||
markupsafe/_speedups.cpython-36m-darwin.so,sha256=0vozF8REMN0zriSHLpbLrkp0dAJ38SLFAb13MDfUyaQ,10600
|
||||
MarkupSafe-1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
markupsafe/__pycache__/_native.cpython-36.pyc,,
|
||||
markupsafe/__pycache__/_constants.cpython-36.pyc,,
|
||||
markupsafe/__pycache__/_compat.cpython-36.pyc,,
|
||||
markupsafe/__pycache__/__init__.cpython-36.pyc,,
|
|
@ -1,5 +0,0 @@
|
|||
Wheel-Version: 1.0
|
||||
Generator: bdist_wheel (0.30.0)
|
||||
Root-Is-Purelib: false
|
||||
Tag: cp36-cp36m-macosx_10_13_x86_64
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Markup :: HTML"], "extensions": {"python.details": {"contacts": [{"email": "armin.ronacher@active-4.com", "name": "Armin Ronacher", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "http://github.com/pallets/markupsafe"}}}, "generator": "bdist_wheel (0.30.0)", "license": "BSD", "metadata_version": "2.0", "name": "MarkupSafe", "summary": "Implements a XML/HTML/XHTML Markup safe string for Python", "version": "1.0"}
|
|
@ -1 +0,0 @@
|
|||
markupsafe
|
|
@ -1 +0,0 @@
|
|||
pip
|
|
@ -1,20 +0,0 @@
|
|||
This is the MIT license: http://www.opensource.org/licenses/mit-license.php
|
||||
|
||||
Copyright (c) 2005-2018 the SQLAlchemy authors and contributors <see AUTHORS file>.
|
||||
SQLAlchemy is a trademark of Michael Bayer.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
|
||||
to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
||||
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
|
@ -1,180 +0,0 @@
|
|||
Metadata-Version: 2.1
|
||||
Name: SQLAlchemy
|
||||
Version: 1.2.7
|
||||
Summary: Database Abstraction Library
|
||||
Home-page: http://www.sqlalchemy.org
|
||||
Author: Mike Bayer
|
||||
Author-email: mike_mp@zzzcomputing.com
|
||||
License: MIT License
|
||||
Platform: UNKNOWN
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: MIT License
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: Implementation :: CPython
|
||||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||||
Classifier: Topic :: Database :: Front-Ends
|
||||
Classifier: Operating System :: OS Independent
|
||||
Provides-Extra: postgresql
|
||||
Provides-Extra: postgresql_psycopg2cffi
|
||||
Provides-Extra: oracle
|
||||
Provides-Extra: mssql_pymssql
|
||||
Provides-Extra: mysql
|
||||
Provides-Extra: postgresql_pg8000
|
||||
Provides-Extra: pymysql
|
||||
Provides-Extra: mssql_pyodbc
|
||||
Provides-Extra: mssql_pymssql
|
||||
Requires-Dist: pymssql; extra == 'mssql_pymssql'
|
||||
Provides-Extra: mssql_pyodbc
|
||||
Requires-Dist: pyodbc; extra == 'mssql_pyodbc'
|
||||
Provides-Extra: mysql
|
||||
Requires-Dist: mysqlclient; extra == 'mysql'
|
||||
Provides-Extra: oracle
|
||||
Requires-Dist: cx-oracle; extra == 'oracle'
|
||||
Provides-Extra: postgresql
|
||||
Requires-Dist: psycopg2; extra == 'postgresql'
|
||||
Provides-Extra: postgresql_pg8000
|
||||
Requires-Dist: pg8000; extra == 'postgresql_pg8000'
|
||||
Provides-Extra: postgresql_psycopg2cffi
|
||||
Requires-Dist: psycopg2cffi; extra == 'postgresql_psycopg2cffi'
|
||||
Provides-Extra: pymysql
|
||||
Requires-Dist: pymysql; extra == 'pymysql'
|
||||
|
||||
SQLAlchemy
|
||||
==========
|
||||
|
||||
The Python SQL Toolkit and Object Relational Mapper
|
||||
|
||||
Introduction
|
||||
-------------
|
||||
|
||||
SQLAlchemy is the Python SQL toolkit and Object Relational Mapper
|
||||
that gives application developers the full power and
|
||||
flexibility of SQL. SQLAlchemy provides a full suite
|
||||
of well known enterprise-level persistence patterns,
|
||||
designed for efficient and high-performing database
|
||||
access, adapted into a simple and Pythonic domain
|
||||
language.
|
||||
|
||||
Major SQLAlchemy features include:
|
||||
|
||||
* An industrial strength ORM, built
|
||||
from the core on the identity map, unit of work,
|
||||
and data mapper patterns. These patterns
|
||||
allow transparent persistence of objects
|
||||
using a declarative configuration system.
|
||||
Domain models
|
||||
can be constructed and manipulated naturally,
|
||||
and changes are synchronized with the
|
||||
current transaction automatically.
|
||||
* A relationally-oriented query system, exposing
|
||||
the full range of SQL's capabilities
|
||||
explicitly, including joins, subqueries,
|
||||
correlation, and most everything else,
|
||||
in terms of the object model.
|
||||
Writing queries with the ORM uses the same
|
||||
techniques of relational composition you use
|
||||
when writing SQL. While you can drop into
|
||||
literal SQL at any time, it's virtually never
|
||||
needed.
|
||||
* A comprehensive and flexible system
|
||||
of eager loading for related collections and objects.
|
||||
Collections are cached within a session,
|
||||
and can be loaded on individual access, all
|
||||
at once using joins, or by query per collection
|
||||
across the full result set.
|
||||
* A Core SQL construction system and DBAPI
|
||||
interaction layer. The SQLAlchemy Core is
|
||||
separate from the ORM and is a full database
|
||||
abstraction layer in its own right, and includes
|
||||
an extensible Python-based SQL expression
|
||||
language, schema metadata, connection pooling,
|
||||
type coercion, and custom types.
|
||||
* All primary and foreign key constraints are
|
||||
assumed to be composite and natural. Surrogate
|
||||
integer primary keys are of course still the
|
||||
norm, but SQLAlchemy never assumes or hardcodes
|
||||
to this model.
|
||||
* Database introspection and generation. Database
|
||||
schemas can be "reflected" in one step into
|
||||
Python structures representing database metadata;
|
||||
those same structures can then generate
|
||||
CREATE statements right back out - all within
|
||||
the Core, independent of the ORM.
|
||||
|
||||
SQLAlchemy's philosophy:
|
||||
|
||||
* SQL databases behave less and less like object
|
||||
collections the more size and performance start to
|
||||
matter; object collections behave less and less like
|
||||
tables and rows the more abstraction starts to matter.
|
||||
SQLAlchemy aims to accommodate both of these
|
||||
principles.
|
||||
* An ORM doesn't need to hide the "R". A relational
|
||||
database provides rich, set-based functionality
|
||||
that should be fully exposed. SQLAlchemy's
|
||||
ORM provides an open-ended set of patterns
|
||||
that allow a developer to construct a custom
|
||||
mediation layer between a domain model and
|
||||
a relational schema, turning the so-called
|
||||
"object relational impedance" issue into
|
||||
a distant memory.
|
||||
* The developer, in all cases, makes all decisions
|
||||
regarding the design, structure, and naming conventions
|
||||
of both the object model as well as the relational
|
||||
schema. SQLAlchemy only provides the means
|
||||
to automate the execution of these decisions.
|
||||
* With SQLAlchemy, there's no such thing as
|
||||
"the ORM generated a bad query" - you
|
||||
retain full control over the structure of
|
||||
queries, including how joins are organized,
|
||||
how subqueries and correlation is used, what
|
||||
columns are requested. Everything SQLAlchemy
|
||||
does is ultimately the result of a developer-
|
||||
initiated decision.
|
||||
* Don't use an ORM if the problem doesn't need one.
|
||||
SQLAlchemy consists of a Core and separate ORM
|
||||
component. The Core offers a full SQL expression
|
||||
language that allows Pythonic construction
|
||||
of SQL constructs that render directly to SQL
|
||||
strings for a target database, returning
|
||||
result sets that are essentially enhanced DBAPI
|
||||
cursors.
|
||||
* Transactions should be the norm. With SQLAlchemy's
|
||||
ORM, nothing goes to permanent storage until
|
||||
commit() is called. SQLAlchemy encourages applications
|
||||
to create a consistent means of delineating
|
||||
the start and end of a series of operations.
|
||||
* Never render a literal value in a SQL statement.
|
||||
Bound parameters are used to the greatest degree
|
||||
possible, allowing query optimizers to cache
|
||||
query plans effectively and making SQL injection
|
||||
attacks a non-issue.
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
Latest documentation is at:
|
||||
|
||||
http://www.sqlalchemy.org/docs/
|
||||
|
||||
Installation / Requirements
|
||||
---------------------------
|
||||
|
||||
Full documentation for installation is at
|
||||
`Installation <http://www.sqlalchemy.org/docs/intro.html#installation>`_.
|
||||
|
||||
Getting Help / Development / Bug reporting
|
||||
------------------------------------------
|
||||
|
||||
Please refer to the `SQLAlchemy Community Guide <http://www.sqlalchemy.org/support.html>`_.
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
SQLAlchemy is distributed under the `MIT license
|
||||
<http://www.opensource.org/licenses/mit-license.php>`_.
|
||||
|
||||
|
||||
|
|
@ -1,389 +0,0 @@
|
|||
SQLAlchemy-1.2.7.dist-info/LICENSE.txt,sha256=c72j19bFaPSUwdElIKl9QaOLfOkdiMIfG0abdHsX9_0,1229
|
||||
SQLAlchemy-1.2.7.dist-info/METADATA,sha256=A_yJ38mMXt0HPCCQmSygZzDIuJLFTla5MOdvA7aIfQ4,6563
|
||||
SQLAlchemy-1.2.7.dist-info/RECORD,,
|
||||
SQLAlchemy-1.2.7.dist-info/WHEEL,sha256=mvUKYmGtxB2TxBT6pBp7PWP3fRlxIMuhhGt_n6cLCfM,111
|
||||
SQLAlchemy-1.2.7.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11
|
||||
sqlalchemy/__init__.py,sha256=1rcr37W21337j8yeRlDiajEfktXSrl0bN3IhfdNC9_I,2248
|
||||
sqlalchemy/cprocessors.cpython-36m-darwin.so,sha256=B-fmwKbWl5VSardjbjK20R_ufnrcL5lERFiG5fxg3nI,16892
|
||||
sqlalchemy/cresultproxy.cpython-36m-darwin.so,sha256=B4yQy-ZsSH9WYcsMPpWlZ-bHCyMrcOVQMlfIWWhLcDQ,18844
|
||||
sqlalchemy/cutils.cpython-36m-darwin.so,sha256=8qsLljxJ52x8McGz0Jw3twwzx3wDAThDgKAfLxGFOTw,9756
|
||||
sqlalchemy/events.py,sha256=oy18Pqf1Sw0VV-l8tVPeEVn-EgLOSwOK9m68Dep4Yn8,49746
|
||||
sqlalchemy/exc.py,sha256=B8e-WMzl6nLJH1Zf29nSgiAPHdFQncJfnEVunytV6hI,14432
|
||||
sqlalchemy/inspection.py,sha256=OcKvEukttgf8L8hpp-sNS-6fJSvrClRUQAD_O3NWfXQ,3093
|
||||
sqlalchemy/interfaces.py,sha256=51RGQymBHqZ4Saj2PZEZ5xk-AGZ72AYKmoTTEBsTEPc,10967
|
||||
sqlalchemy/log.py,sha256=c9RRbdYa0iOw_6sgdISr0NcM6xJPe6BT2lrYtnoSxGA,6712
|
||||
sqlalchemy/pool.py,sha256=24YZGCJrHbMMdDlE-HLQg1u4IFz6xLuwPu0Kc7vHm1c,52412
|
||||
sqlalchemy/processors.py,sha256=xxZZ1TrStefh2oh0MiWTZQNuNJAi15IxpRs_zkFggXY,5104
|
||||
sqlalchemy/schema.py,sha256=S8tx3M3c-cAPZv9ADlzY2eE_cZ7NurHH8cWUHYHcSkw,1289
|
||||
sqlalchemy/types.py,sha256=PoH2ZBkg-fqdntFKFBAAQMSoyAVxWtI_kKvqeZADMDc,1713
|
||||
sqlalchemy/connectors/__init__.py,sha256=rrgdmDtnZrYz2KspapOs6wEkbRh0nnLSGAGZ1_9w2_o,278
|
||||
sqlalchemy/connectors/mxodbc.py,sha256=1JQJ9A9oBDamnA8hGjxTd0duDfa-KZLd-dYuBzpMcVc,5348
|
||||
sqlalchemy/connectors/pyodbc.py,sha256=c0Q60nv30NR7GohqxnabESUAO4CqXfyhzBUCG6HdR78,5648
|
||||
sqlalchemy/connectors/zxJDBC.py,sha256=KYrmLZt8Y5Qr49sja2ALf8IPnExjk4zsGrQqNJqgtxA,1868
|
||||
sqlalchemy/databases/__init__.py,sha256=ZOSHd9ibbeNSthK3xVTpl5lRJbA0fR1IUVskoytyrHE,817
|
||||
sqlalchemy/dialects/__init__.py,sha256=rrWo1qtl19-67MV9hxlbt5XYZJjC5BlTwdKGxd0PUUc,1346
|
||||
sqlalchemy/dialects/firebird/__init__.py,sha256=XfFW_BjZuiB2k0Mhc2PnWndfPu5viJMkC6QZ68sKHUQ,627
|
||||
sqlalchemy/dialects/firebird/base.py,sha256=J1uFdDD2FF84qFspip6bvl3gJm7xO4GW6YUiyfz96z8,28297
|
||||
sqlalchemy/dialects/firebird/fdb.py,sha256=OOEVOxB8o5tJvY-fyGkStlPXjIs6a877vmTBZuWAKko,4325
|
||||
sqlalchemy/dialects/firebird/kinterbasdb.py,sha256=Fj-KyDyXQm-scFDOwpePSweYOBn-EcnPJdEwLA4rxMk,6300
|
||||
sqlalchemy/dialects/mssql/__init__.py,sha256=rqhEBPQR7hHAvfQcNtQqlNspzwHP0n_lz5jzdx6ZIKk,1074
|
||||
sqlalchemy/dialects/mssql/adodbapi.py,sha256=pd-vPua2A8uZ1vulBKZplABa40mMgvhaObJxKk-RvAk,2692
|
||||
sqlalchemy/dialects/mssql/base.py,sha256=mdrwM9sx_eUi06qrFRb2YTpLKZsG82z4kQ5hj0utP7c,77872
|
||||
sqlalchemy/dialects/mssql/information_schema.py,sha256=FXS7NQtJ_9UHlIiz-3SF5eOTBzsxb0erkB4feB0s15E,6481
|
||||
sqlalchemy/dialects/mssql/mxodbc.py,sha256=U0Tu183J9d3YVJ18h-Ro6dUo7uPZdBAPrtDit0PDSkc,4604
|
||||
sqlalchemy/dialects/mssql/pymssql.py,sha256=BMapRUlKdwKlyqqOHu5DnZI1_L1IK8N5VCDMdWmlH-U,3852
|
||||
sqlalchemy/dialects/mssql/pyodbc.py,sha256=V074z3m5ELQf0Cp4G6wBH1Lzm7He8us53Z20OHGPKfM,10717
|
||||
sqlalchemy/dialects/mssql/zxjdbc.py,sha256=vGfY3F80odCna8_uVjguLPO0VXAyDwDobBQfJsByw7M,2282
|
||||
sqlalchemy/dialects/mysql/__init__.py,sha256=ak3nuGjushrYFvbM4f4xldmqPw_zaBe9vzmBlMsxHb0,1221
|
||||
sqlalchemy/dialects/mysql/base.py,sha256=aTp0Bfawv18EpkjtbJZlViHGwxeTqK8ocC7HUA4snU4,86787
|
||||
sqlalchemy/dialects/mysql/cymysql.py,sha256=T7eHTy4KqN8A4xpDktp2JSZjpVCMd1zB3TFZOoFV8Z4,1998
|
||||
sqlalchemy/dialects/mysql/dml.py,sha256=VyUXudSFgMfpivUFH_T049WH1Xo1CLXKLIjG1HyQMXw,2680
|
||||
sqlalchemy/dialects/mysql/enumerated.py,sha256=V9c9_71luaSUEoctXNAPLI8je-J18G1xaTv31SSv17g,11363
|
||||
sqlalchemy/dialects/mysql/gaerdbms.py,sha256=a94buqzpqDBhePvBANjCe5fOmRnQU8-PKK5B8qfLuK4,3387
|
||||
sqlalchemy/dialects/mysql/json.py,sha256=fpm8X6SBhX3vhBxBG1ia33Y33AmKrBkAUkuyvk66B0w,2071
|
||||
sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=eLKXT7bJf2RIjpI4oqUVKH0ExgsLdRuIXyPNV8IY2SA,6406
|
||||
sqlalchemy/dialects/mysql/mysqldb.py,sha256=2zD9kzFfXqa5Y4gmTB2VLNp_jnQGKoSWBvlLZp78wqc,6947
|
||||
sqlalchemy/dialects/mysql/oursql.py,sha256=m9F7sFDBFpRY0AqpDq6sBOl6d-CU4n3ZYOGyb0vvLdY,7776
|
||||
sqlalchemy/dialects/mysql/pymysql.py,sha256=zVSQXSgRRk8i2CSQqwrTdbVjWC88V8IlXG9GB1VUr4A,1989
|
||||
sqlalchemy/dialects/mysql/pyodbc.py,sha256=MHywwWXyOZ94Gl8fqSj_L8hNqfIOApFXhHZ6X1hZhxc,2657
|
||||
sqlalchemy/dialects/mysql/reflection.py,sha256=X38QEhDSmbKMG9diXHreXr-GlNLatR1W6J5Bymrxrao,16703
|
||||
sqlalchemy/dialects/mysql/types.py,sha256=yboSkXVM4Hfse8ZqaAHht1571XgQ-RHrXgj22pSTe7E,25137
|
||||
sqlalchemy/dialects/mysql/zxjdbc.py,sha256=-arAeE65pqUuMzBHLfzfMpBnTlNVtD2tkhZInomSP60,3937
|
||||
sqlalchemy/dialects/oracle/__init__.py,sha256=0aHajiUEgaE6jARlaSdsuurEXmhGTkeLX9EO99IDVMI,811
|
||||
sqlalchemy/dialects/oracle/base.py,sha256=1jyzM74yPlav6IPzfMrL_03NtoteqAvPi_mjfnEDOiU,65203
|
||||
sqlalchemy/dialects/oracle/cx_oracle.py,sha256=we4jy1SeOs3eNz5MivE0nq_7WOqOgu31n-OSu9p9FZ8,33135
|
||||
sqlalchemy/dialects/oracle/zxjdbc.py,sha256=cmDtRIa-cYqNLkzyZBlfyeigaEQFe7ffRWxxqRHyUBQ,8112
|
||||
sqlalchemy/dialects/postgresql/__init__.py,sha256=e74OBltKsvshxdDxacC-1JUDmhMa0qyw-nZ68TF341M,1529
|
||||
sqlalchemy/dialects/postgresql/array.py,sha256=hMO962lq4eZWNoXnKnq6tLX27b66-pZtmx7ON3hzj50,9952
|
||||
sqlalchemy/dialects/postgresql/base.py,sha256=ZqZYAiMsLrkgucxokYIj98Hl33HpDoyq6sfDVVW6d7U,113128
|
||||
sqlalchemy/dialects/postgresql/dml.py,sha256=1vcMv0EfFXmW_NeMjNHMhPOS7p6GyhhBWLQy531k8_o,7571
|
||||
sqlalchemy/dialects/postgresql/ext.py,sha256=ibuurm5e2ZVhpV4njwcbSyVJ1xJQtROXMA71spNiKwE,6860
|
||||
sqlalchemy/dialects/postgresql/hstore.py,sha256=qmcAGQsdqlMHPcGgSzqNr5ZIufskKb-Q9cqMXWbfhyE,12411
|
||||
sqlalchemy/dialects/postgresql/json.py,sha256=7KHjtiPDYlyrpnrIGo5JWpg8uC8xh_0BHzz0gvNOFso,9821
|
||||
sqlalchemy/dialects/postgresql/pg8000.py,sha256=0Yobx92-frW-BuVLM-lOVduhBsbhbX7inMWdZaQrz3w,9220
|
||||
sqlalchemy/dialects/postgresql/psycopg2.py,sha256=ythf8lkG7CVncRlsGNVYrw8XOlOpfHYw1S6z0c2aLik,27187
|
||||
sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=Ako0qThKTsuXiZB4t2ZWGysT1qrcfSJryalE2Ik5syw,1651
|
||||
sqlalchemy/dialects/postgresql/pygresql.py,sha256=JV589Bg3z_7bKieAP4lIqWzJpbR_O9DOmpCmH012c8Y,7611
|
||||
sqlalchemy/dialects/postgresql/pypostgresql.py,sha256=T-gI_Rz6CV0c1-RgWm8NliN9iZWoK2KNGIidcg_5KlM,2655
|
||||
sqlalchemy/dialects/postgresql/ranges.py,sha256=DJCITJtwFAJ74a3sYFizz69wm3FhfHPkzLDntGqhphw,4971
|
||||
sqlalchemy/dialects/postgresql/zxjdbc.py,sha256=KE-mXnKcl68PIvF11aBpiFiolCbH16n_LJMDlCBuWJQ,1397
|
||||
sqlalchemy/dialects/sqlite/__init__.py,sha256=cvuTxTCYYsC_GHaOCCVc_dpaymxy0lpfFv1c89QDQ48,720
|
||||
sqlalchemy/dialects/sqlite/base.py,sha256=ZVr368SQRntts4Y745jpZiQkv2Fda11Z5rcleNLbybI,59038
|
||||
sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=MLj6njhSj5RwQCs5PXQRtTO-jUCfCGfjLyQfp52tFus,4650
|
||||
sqlalchemy/dialects/sqlite/pysqlite.py,sha256=aAhdzjnyJrVrOLU_W2QB3YXY6qcOpbOqUpPZVx7GTMQ,14975
|
||||
sqlalchemy/dialects/sybase/__init__.py,sha256=gh1f630fgd5Wow5tfr5HPWxKBMqFn6YSZYAQ2EZX2yA,873
|
||||
sqlalchemy/dialects/sybase/base.py,sha256=F-izMkFqZJ7cdS7P0sX_GuRp91ZqbWLrbwO5VogmPfE,29456
|
||||
sqlalchemy/dialects/sybase/mxodbc.py,sha256=EHt1U0g449XNX8tN0oTxIkVterSipz9HErniuo7upZs,901
|
||||
sqlalchemy/dialects/sybase/pyodbc.py,sha256=bOkWunYEOfA7lLL59S_yxJ11E6QkFuBN5YjnUlKJkXQ,2102
|
||||
sqlalchemy/dialects/sybase/pysybase.py,sha256=UNcGk5DQ4T05AeozHlm68JTIQDcha5pvAzGj9VtKWlY,3208
|
||||
sqlalchemy/engine/__init__.py,sha256=mHlCzrEq22sQXy2jgPwCro-KIqh-6e7v3_BvDG6XVck,20438
|
||||
sqlalchemy/engine/base.py,sha256=WpQwUwXvdkR-OJIhE6h4hBmTWJEhEcnw710XswWHuno,83270
|
||||
sqlalchemy/engine/default.py,sha256=NPhaoSpinqFfYqt1SoJ8JCZB-fto_P7WRzb3Epixl4k,48863
|
||||
sqlalchemy/engine/interfaces.py,sha256=sX6XTe1YDGAU8HIt9XRlylbNAR58EiONEwGCdcmZX_A,41554
|
||||
sqlalchemy/engine/reflection.py,sha256=Ft7eFqEK8phKXcGPwJqMevW7T96DheGNANpwMNTJ7os,31894
|
||||
sqlalchemy/engine/result.py,sha256=kDPnsNcwj1w5XGE_tGZM75g0hamsiWrNvLBWTzTbn0c,51717
|
||||
sqlalchemy/engine/strategies.py,sha256=Sozz1zXVkyjW6I4jsgYVcsJp8KYgN4YkPqvsb3sUCZQ,9552
|
||||
sqlalchemy/engine/threadlocal.py,sha256=_zaDX4IcY7wcdQpoSIZYR6LujR5VrbmkpiPybW2dg5s,4186
|
||||
sqlalchemy/engine/url.py,sha256=1s60hXA1oen8E1VeUUOKWvVVQldAvwxJpOMHDUiisl4,9181
|
||||
sqlalchemy/engine/util.py,sha256=iP2jhZWMEFi6eBR5hXyp2KDd4XqJKrGE3tA_QeCwU_w,2338
|
||||
sqlalchemy/event/__init__.py,sha256=MTOLXdVCMskX_yRE5dZwWHNkMLkv-y9caaM9XFwlR8E,419
|
||||
sqlalchemy/event/api.py,sha256=U8n3cmqB9DaO6UYud2RHMNXsEoELmKzhQRXPEq1q-qQ,5990
|
||||
sqlalchemy/event/attr.py,sha256=Bpwt2BDboQy1oAtjJ2T2LsXwjALXPf3nKZmEnqx_RHg,12905
|
||||
sqlalchemy/event/base.py,sha256=3DoHv2ecDAtNN3b-F2o2yCVp4uWcAiv_OcEE-Lvwov8,9540
|
||||
sqlalchemy/event/legacy.py,sha256=hsxGTAa3aKkCgByaiBF_MddZxY0ORp2CYEfe5kQy93U,5814
|
||||
sqlalchemy/event/registry.py,sha256=L3DdvjGeESvn_Pmj7Fkm2wbMOrHUkdhAkkJeR7ij7cg,7786
|
||||
sqlalchemy/ext/__init__.py,sha256=dZJYsRwHsMYpTkUyMDACt0CVVxqe-EvP0bTCgBH0gKE,322
|
||||
sqlalchemy/ext/associationproxy.py,sha256=ifkmGlpwVAkW9VcgBQ1yCVSaz-P9KdNfGnX-DeB1FUo,36302
|
||||
sqlalchemy/ext/automap.py,sha256=ojCBWf4v37SatG1s1VxGS1s2EZBq13H8chMTEMyyrzE,42099
|
||||
sqlalchemy/ext/baked.py,sha256=mw8qoNcyA1lbM4ffV57FsJS9NGPhodKqU7mGIva9cBo,18171
|
||||
sqlalchemy/ext/compiler.py,sha256=vmIz7I8mOpihaZDhAcNpeky48IIeB8QMTgxxPMFtmJ4,16845
|
||||
sqlalchemy/ext/horizontal_shard.py,sha256=zT5JyUrSlhcN5pdbmLFtLeelB-MEj2WJ1opNZf8HB00,7364
|
||||
sqlalchemy/ext/hybrid.py,sha256=V-ktQSoLFcMgD0D0Mgbsl9QeHcUHMA78fJgpdmO44w4,39164
|
||||
sqlalchemy/ext/indexable.py,sha256=SDNEPbRxtIR535iy8-7H976WbNQJSnJ_4oaXnyGJbko,11128
|
||||
sqlalchemy/ext/instrumentation.py,sha256=HRgNiuYJ90_uSKC1iDwsEl8_KXscMQkEb9KeElk-yLE,14856
|
||||
sqlalchemy/ext/mutable.py,sha256=2qgpHBVm1b6zy3IKGofM3-8PwUkCIUr8vwGpDN_nFMY,32531
|
||||
sqlalchemy/ext/orderinglist.py,sha256=-pUrJOsZkjOt7F0G_6y38h8rq0cYltvFMHjv4WHlRaI,13816
|
||||
sqlalchemy/ext/serializer.py,sha256=2M_aXqRksCYNd_Sef-l4AZ8hRFKOMYJD7Y5xyCqO_E4,5608
|
||||
sqlalchemy/ext/declarative/__init__.py,sha256=8dR4W5dZ6DztbqaOp5g0OS8aqWIwTGGDA4uVyJ-BHoc,756
|
||||
sqlalchemy/ext/declarative/api.py,sha256=4s67E7i0YQm9f5ucL2bEvBJnRcNjS0XYRo_EILa0srA,25066
|
||||
sqlalchemy/ext/declarative/base.py,sha256=-lu3BtZUtcL9vGZ3-c_lF_10eJ1ylIX1l5I3bE0Xrwk,27481
|
||||
sqlalchemy/ext/declarative/clsregistry.py,sha256=CwCu667YYxnXPWfsxU_w3cLou4BODKHh2BjVvozkPAw,10817
|
||||
sqlalchemy/orm/__init__.py,sha256=Um0BgXXSPuVe2D-PV0ioQopLAVm0LSbnEzQZB0g-LAI,8763
|
||||
sqlalchemy/orm/attributes.py,sha256=qb2xCad09bDfFDDk_SIEhDUoNodDrHAMg5xFnCsypW4,60528
|
||||
sqlalchemy/orm/base.py,sha256=x0BQD-UoaSySthekaCWzs8yT9IJeRyO_AgimQbBlkpg,14668
|
||||
sqlalchemy/orm/collections.py,sha256=fH5nFWzoTeeCYeuaaqTsibY_3IU7WpwYdfjLNMdVSsw,52449
|
||||
sqlalchemy/orm/dependency.py,sha256=hXpJsTfC4eKZyjPm6AOXOQaMb4geIwn-IGpBaXBNfME,45802
|
||||
sqlalchemy/orm/deprecated_interfaces.py,sha256=5Vzc_YJVzjJDTz3jDIj6S3Uh59NAcFfmCV5AYVUlY_s,18254
|
||||
sqlalchemy/orm/descriptor_props.py,sha256=Enhwqjqmt8EiyCgxKcOeDUauonT4yQWg5ncYF4RTkQw,27751
|
||||
sqlalchemy/orm/dynamic.py,sha256=Wo3ogq54-zFOnkl0kOyeV91e3McjF84ydur0t71rJEk,13171
|
||||
sqlalchemy/orm/evaluator.py,sha256=GH81gACGkSBkynmfqHgqlZYjU3wv9pXqnZ0hGnxGuFY,5411
|
||||
sqlalchemy/orm/events.py,sha256=MpbZ50TZK3PHT4_fSIdoIJ2P-nDugwd_gsnqZpcintg,88324
|
||||
sqlalchemy/orm/exc.py,sha256=CgXQOVleTlrPxag-cqbLWpvYZEHAP4qgoL8AV-JuRGM,5459
|
||||
sqlalchemy/orm/identity.py,sha256=lC9aPcReGjm7Lj7FlFhfFQR5_Ek0jvKXiC_5yBsb-1A,10255
|
||||
sqlalchemy/orm/instrumentation.py,sha256=fDfrl1KDyfQOG-y1XvqQvRtflUcU8mX0cyyWBafINtc,18819
|
||||
sqlalchemy/orm/interfaces.py,sha256=4SDf6tZQjVncR2_cBO30zo4IA13eOHNpjVLQnh1NzaE,23173
|
||||
sqlalchemy/orm/loading.py,sha256=tzy5MVeh7EumbdMT4g5XruZJNmatHMPsWW8modbUJP4,31150
|
||||
sqlalchemy/orm/mapper.py,sha256=CZpazUb9WsSIz_i8PUNt7o05E2JUU5OGgwuyqiU_CRQ,125593
|
||||
sqlalchemy/orm/path_registry.py,sha256=0KNqaTaHFchUkEGZ9ivXal2Eo2DLri-DQTgRVuB7wDA,7751
|
||||
sqlalchemy/orm/persistence.py,sha256=aItA-dvAesmxJLK_SUoanhBcFvfEWAzJkUit6CjE1jc,59549
|
||||
sqlalchemy/orm/properties.py,sha256=4kJybUUAshFg1M12BliUWDxhlhQIQ1_2FpripXbygJQ,10458
|
||||
sqlalchemy/orm/query.py,sha256=gxvAfil-QSvwSK8vzQVPpoGCrHYLo5etImwKYLJtNnc,157918
|
||||
sqlalchemy/orm/relationships.py,sha256=SlPjGqMziCgjm4Ku67U_GdQbSLFVrleitTqV-tUCP4o,118398
|
||||
sqlalchemy/orm/scoping.py,sha256=DOCDDbBCQFvibuVinlJjGlp_UyJCrZ_QONo-9wOwG9U,6272
|
||||
sqlalchemy/orm/session.py,sha256=5nZ_aXdy-2cwwV3IpGwRRj4rW0HobfpJFEF2tGrAqY0,123364
|
||||
sqlalchemy/orm/state.py,sha256=UXxJoFtRep42l1k9L5HUMZ7vNcu8MLBYcs6KmXqH8uw,28837
|
||||
sqlalchemy/orm/strategies.py,sha256=Xu6_KZq737mIYPG2ifM6F610uIK66I44lpVONg5J134,73937
|
||||
sqlalchemy/orm/strategy_options.py,sha256=K1GZHtna29IjI1kS0TiJ5STfoDIqsZLbaAdn3Fn1a9Y,48321
|
||||
sqlalchemy/orm/sync.py,sha256=ZkUytu_ucR9qMvj0rYUHCbx44qM2X_taMZe2BKLhhJc,5451
|
||||
sqlalchemy/orm/unitofwork.py,sha256=zvHw5dJmJw2m6q5GpKxC4NJ-88_40HltUrL_zgglU5I,24586
|
||||
sqlalchemy/orm/util.py,sha256=B3KRGZYgQlzdFPsgDVY6LZLaRo_FeqAvCMXvKeNQ1No,41244
|
||||
sqlalchemy/sql/__init__.py,sha256=xoVOg-2Frtowwp_2SjtsncUNkN6fZ04DODnZ0eBmivA,1869
|
||||
sqlalchemy/sql/annotation.py,sha256=QQmA_W2SOpCehVyTM8BfK3aZD8rABVT9G6Z2I0MTM7o,6654
|
||||
sqlalchemy/sql/base.py,sha256=DquGOb23-W1vid2TxTfmMpPGNnwcW5PhflqcAuH2x7o,21012
|
||||
sqlalchemy/sql/compiler.py,sha256=IqBL5dsRNqqWN9vdvLGc3eviMA2q0r80Vi2HCLhf9xs,114575
|
||||
sqlalchemy/sql/crud.py,sha256=9OjyAOXZ0xTgwn3hK1b8hzwS9zj-G3hBGVaR3F3o61o,25069
|
||||
sqlalchemy/sql/ddl.py,sha256=KOGv8IxBRSnCraolx4T4p-Od4SXkc0N-AvH5AsLErbM,38760
|
||||
sqlalchemy/sql/default_comparator.py,sha256=XpYI3Jqn72SpigQyy1T618L7NubMjacfvFTrbKeK2VY,12032
|
||||
sqlalchemy/sql/dml.py,sha256=TgQAtNKW6LgTpbo4BZxEAbHtJDcUUtRTaE5dH0ZuvPg,34451
|
||||
sqlalchemy/sql/elements.py,sha256=rJF2A-uAOaH7p46fLcqbhFnXcBO82MCmhie0tBjzISE,150021
|
||||
sqlalchemy/sql/expression.py,sha256=6JyyfdqdtuyJiIU3h_U8N6NrylJ-Cg5p66ahsid2Fkk,6335
|
||||
sqlalchemy/sql/functions.py,sha256=YnvRENTPs5OWSYjbilTtoR42qElEHxnJ3JAUB9lER2U,26284
|
||||
sqlalchemy/sql/naming.py,sha256=8wxA_omnCzrJQ4jO5DdGJYN5zAlYWaeiZvaT8gKei3M,4662
|
||||
sqlalchemy/sql/operators.py,sha256=RuTdtr8VB_34CsPH1VTuDjTf0imjLOSRhk7Sc2Kv9JU,39449
|
||||
sqlalchemy/sql/schema.py,sha256=YgvE_fFKqs17_iM547vrvd-w26vYLGDfKsV_iJutMoQ,159245
|
||||
sqlalchemy/sql/selectable.py,sha256=ojYr2AeS4Pe02hxenCZcLkOPRuCbK8W5R1frWnRYIFQ,127948
|
||||
sqlalchemy/sql/sqltypes.py,sha256=mgYdF0Buvuz97Lhppt1tFsFNBypL5R8dWxUrBPkefqM,92725
|
||||
sqlalchemy/sql/type_api.py,sha256=C5RiJPgz3gKBwJbDOa_F4eY7Mkj4zB18qHRhCmu_s5c,49790
|
||||
sqlalchemy/sql/util.py,sha256=iKrQYXL0aCACOZzl0yoQRXemZERErzRtT6Ca9KE7Ggw,24844
|
||||
sqlalchemy/sql/visitors.py,sha256=VZNpyVTjeW6JBdLNTzdUGgzhsWfuwseq83CQaHNE7p0,10266
|
||||
sqlalchemy/testing/__init__.py,sha256=lS_k5h5ApYxpAx1oGzzKh7DlMNT-ECWRlqaBjYh8y3g,1146
|
||||
sqlalchemy/testing/assertions.py,sha256=3Px0lTEEiNQXnzHPMj31y6gDyamBuruGKOzgdVCB5CU,17210
|
||||
sqlalchemy/testing/assertsql.py,sha256=rPuxqGDk6VeksC9H3yAzvHLB8Detx5p6yKouiOEFAuQ,13249
|
||||
sqlalchemy/testing/config.py,sha256=OZ53Y2cqFONCo-gdgexRiMmUkVdLhZzu13RInI97c8k,2729
|
||||
sqlalchemy/testing/engines.py,sha256=2EO6a9IRJ6LWE66Ur1JrUF3jHXkrXPtl_0ImWCaiGv0,10104
|
||||
sqlalchemy/testing/entities.py,sha256=hM-4tFsUSD6aYmrNNPk40Pl-r1igkRpamQRhvxptlQE,2992
|
||||
sqlalchemy/testing/exclusions.py,sha256=pHmjMhl9sPX2cR2CHBxxJGCrlCewwYZMl2X70-3pd8E,12647
|
||||
sqlalchemy/testing/fixtures.py,sha256=6eywiWK8bdxdK-4I3fqxyDOHqX3Eo6xGad7wI3NLn2o,10733
|
||||
sqlalchemy/testing/mock.py,sha256=FHzc3v4APchNIr_CsQmGFGFGjgYhEWEC7ldOFksicDE,630
|
||||
sqlalchemy/testing/pickleable.py,sha256=dBtRFeAp26iIc2IRnSiGVS3sM5Mv8yM-d6peMAKvX08,2641
|
||||
sqlalchemy/testing/profiling.py,sha256=1AZ3YOAZgyZmHSvryBU1d9G_uQ2uDog1BS1DUcuECEk,8392
|
||||
sqlalchemy/testing/provision.py,sha256=PleM3ZOllo_T50ADy5rJrlifnmD4qMFOaQqI4fLgEek,12934
|
||||
sqlalchemy/testing/replay_fixture.py,sha256=iAxg7XsFkKSCcJnrNPQNJfjMxOgeBAa-ShOkywWPJ4w,5429
|
||||
sqlalchemy/testing/requirements.py,sha256=X5sZ9uRIZ6Koro7DVTOpm8eSmfDj_Y2nrYaI7cMbmbw,25655
|
||||
sqlalchemy/testing/runner.py,sha256=-eFBB4f_Io7Hkpmx6Q-84zI_lLiiB1x_QX_9R205O4Q,1607
|
||||
sqlalchemy/testing/schema.py,sha256=B8TbUi7O62nSvCDmGbwIVblWRUlA0XX_LRyN_Zz3rE0,3496
|
||||
sqlalchemy/testing/util.py,sha256=Lck4smouPjDXAk24gFDJt8LfFhNfg2bz6hhNHHqYr3E,7535
|
||||
sqlalchemy/testing/warnings.py,sha256=TxPoKoCaIrDiIPovvyqI31WafMwJwi8YjDOQgRV-X1A,1301
|
||||
sqlalchemy/testing/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
sqlalchemy/testing/plugin/bootstrap.py,sha256=Iw8R-d1gqoz_NKFtPyGfdX56QPcQHny_9Lvwov65aVY,1634
|
||||
sqlalchemy/testing/plugin/noseplugin.py,sha256=BS3TkwihocaxBVRexAya2KmQN18EVOEEb0Q2wi-o5Nk,2883
|
||||
sqlalchemy/testing/plugin/plugin_base.py,sha256=B4kUwBaqyecAC06pjXO_pvWawbY112mjM21t-3m2Kzk,18311
|
||||
sqlalchemy/testing/plugin/pytestplugin.py,sha256=Oderf9DyC-nHlrC9GRig-mzwEuFsKOsDg2TN64wDnz0,6937
|
||||
sqlalchemy/testing/suite/__init__.py,sha256=wqCTrb28i5FwhQZOyXVlnz3mA94iQOUBio7lszkFq-g,471
|
||||
sqlalchemy/testing/suite/test_ddl.py,sha256=Baw0ou9nKdADmrRuXgWzF1FZx0rvkkw3JHc6yw5BN0M,1838
|
||||
sqlalchemy/testing/suite/test_dialect.py,sha256=iGTMfkkG9yg_RQVRVesLaeg6ITLYDpbCTJSR47Ua-V4,3468
|
||||
sqlalchemy/testing/suite/test_insert.py,sha256=kpiW5l4O8KP6V1L0NEy4hdyXOqsGFX7USXZGTx2Hd84,9637
|
||||
sqlalchemy/testing/suite/test_reflection.py,sha256=3XUGMmPA3GLWqxOf57qAxbztuEWGJq5EAOR6XsZay90,36555
|
||||
sqlalchemy/testing/suite/test_results.py,sha256=UMT5_s0p2_ngse6-ei-UalcXao70IkNYLzm_5s0gKBo,11737
|
||||
sqlalchemy/testing/suite/test_select.py,sha256=aITpc6jE4ORZj33acKbi-DzmkheSDTidRGM_JMObaVc,16001
|
||||
sqlalchemy/testing/suite/test_sequence.py,sha256=jyEM4sBMA2sXoJVHTSOd8vXSVX1gl85XmEBccuu4Clg,4560
|
||||
sqlalchemy/testing/suite/test_types.py,sha256=XwUjKq-mcz0G5EiKP8fpxwKaAO2UyPI21_TLs1lkIgM,26753
|
||||
sqlalchemy/testing/suite/test_update_delete.py,sha256=r5p467r-EUsjEcWGfUE0VPIfN4LLXZpLRnnyBLyyjl4,1582
|
||||
sqlalchemy/util/__init__.py,sha256=zW-FdejHeXtIDdknAKwXyr-OkSkAaQYZOEbBsIo5dz0,2535
|
||||
sqlalchemy/util/_collections.py,sha256=4iPg7skIdOppZyMmyZwGX-WAGe2_UIojctpS-LE3Ga0,28280
|
||||
sqlalchemy/util/compat.py,sha256=OktDdrOx_3go2DybBl_uqvhLDqKMZMiiMDX0zRYuHpU,6910
|
||||
sqlalchemy/util/deprecations.py,sha256=VYVbKqkvRQ8jtzsKpihCCahj90PjKHi1WSQWhdOpl8w,4403
|
||||
sqlalchemy/util/langhelpers.py,sha256=mjfctdRMSr86C695sWHZuqpa19vmfgkSk9G2w-gOZ9M,42624
|
||||
sqlalchemy/util/queue.py,sha256=7vCGAhE4i7H_Am7-e5F6sVgTMNoXBpNGBnwN9Juj9cM,6548
|
||||
sqlalchemy/util/topological.py,sha256=WG0jWfUc_lPS0Blau9GElTux7Gv2nStTKXBqQlCvmU4,2794
|
||||
SQLAlchemy-1.2.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
sqlalchemy/connectors/__pycache__/mxodbc.cpython-36.pyc,,
|
||||
sqlalchemy/connectors/__pycache__/zxJDBC.cpython-36.pyc,,
|
||||
sqlalchemy/connectors/__pycache__/pyodbc.cpython-36.pyc,,
|
||||
sqlalchemy/connectors/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/databases/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/util/__pycache__/topological.cpython-36.pyc,,
|
||||
sqlalchemy/util/__pycache__/langhelpers.cpython-36.pyc,,
|
||||
sqlalchemy/util/__pycache__/deprecations.cpython-36.pyc,,
|
||||
sqlalchemy/util/__pycache__/compat.cpython-36.pyc,,
|
||||
sqlalchemy/util/__pycache__/_collections.cpython-36.pyc,,
|
||||
sqlalchemy/util/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/util/__pycache__/queue.cpython-36.pyc,,
|
||||
sqlalchemy/ext/__pycache__/automap.cpython-36.pyc,,
|
||||
sqlalchemy/ext/__pycache__/serializer.cpython-36.pyc,,
|
||||
sqlalchemy/ext/__pycache__/associationproxy.cpython-36.pyc,,
|
||||
sqlalchemy/ext/__pycache__/hybrid.cpython-36.pyc,,
|
||||
sqlalchemy/ext/__pycache__/orderinglist.cpython-36.pyc,,
|
||||
sqlalchemy/ext/__pycache__/baked.cpython-36.pyc,,
|
||||
sqlalchemy/ext/__pycache__/mutable.cpython-36.pyc,,
|
||||
sqlalchemy/ext/__pycache__/compiler.cpython-36.pyc,,
|
||||
sqlalchemy/ext/__pycache__/horizontal_shard.cpython-36.pyc,,
|
||||
sqlalchemy/ext/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/ext/__pycache__/indexable.cpython-36.pyc,,
|
||||
sqlalchemy/ext/__pycache__/instrumentation.cpython-36.pyc,,
|
||||
sqlalchemy/ext/declarative/__pycache__/clsregistry.cpython-36.pyc,,
|
||||
sqlalchemy/ext/declarative/__pycache__/base.cpython-36.pyc,,
|
||||
sqlalchemy/ext/declarative/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/ext/declarative/__pycache__/api.cpython-36.pyc,,
|
||||
sqlalchemy/__pycache__/inspection.cpython-36.pyc,,
|
||||
sqlalchemy/__pycache__/interfaces.cpython-36.pyc,,
|
||||
sqlalchemy/__pycache__/processors.cpython-36.pyc,,
|
||||
sqlalchemy/__pycache__/types.cpython-36.pyc,,
|
||||
sqlalchemy/__pycache__/pool.cpython-36.pyc,,
|
||||
sqlalchemy/__pycache__/exc.cpython-36.pyc,,
|
||||
sqlalchemy/__pycache__/log.cpython-36.pyc,,
|
||||
sqlalchemy/__pycache__/schema.cpython-36.pyc,,
|
||||
sqlalchemy/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/__pycache__/events.cpython-36.pyc,,
|
||||
sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-36.pyc,,
|
||||
sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-36.pyc,,
|
||||
sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-36.pyc,,
|
||||
sqlalchemy/testing/plugin/__pycache__/noseplugin.cpython-36.pyc,,
|
||||
sqlalchemy/testing/plugin/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/util.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/fixtures.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/replay_fixture.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/config.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/requirements.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/exclusions.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/assertsql.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/pickleable.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/warnings.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/mock.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/provision.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/schema.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/engines.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/profiling.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/entities.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/runner.cpython-36.pyc,,
|
||||
sqlalchemy/testing/__pycache__/assertions.cpython-36.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-36.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_insert.cpython-36.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-36.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-36.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_results.cpython-36.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-36.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_select.cpython-36.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-36.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/testing/suite/__pycache__/test_types.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/sybase/__pycache__/base.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/zxjdbc.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/array.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/base.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/pygresql.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/postgresql/__pycache__/json.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/oracle/__pycache__/zxjdbc.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/oracle/__pycache__/base.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/sqlite/__pycache__/base.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/zxjdbc.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/types.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/base.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/gaerdbms.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/dml.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mysql/__pycache__/json.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mssql/__pycache__/adodbapi.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mssql/__pycache__/zxjdbc.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mssql/__pycache__/base.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/firebird/__pycache__/base.cpython-36.pyc,,
|
||||
sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/util.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/descriptor_props.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/loading.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/dynamic.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/interfaces.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/query.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/properties.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/state.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/persistence.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/path_registry.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/strategies.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/exc.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/attributes.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/base.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/unitofwork.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/collections.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/scoping.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/identity.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/dependency.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/session.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/evaluator.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/strategy_options.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/events.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/sync.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/deprecated_interfaces.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/mapper.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/relationships.cpython-36.pyc,,
|
||||
sqlalchemy/orm/__pycache__/instrumentation.cpython-36.pyc,,
|
||||
sqlalchemy/engine/__pycache__/util.cpython-36.pyc,,
|
||||
sqlalchemy/engine/__pycache__/interfaces.cpython-36.pyc,,
|
||||
sqlalchemy/engine/__pycache__/reflection.cpython-36.pyc,,
|
||||
sqlalchemy/engine/__pycache__/url.cpython-36.pyc,,
|
||||
sqlalchemy/engine/__pycache__/result.cpython-36.pyc,,
|
||||
sqlalchemy/engine/__pycache__/strategies.cpython-36.pyc,,
|
||||
sqlalchemy/engine/__pycache__/default.cpython-36.pyc,,
|
||||
sqlalchemy/engine/__pycache__/base.cpython-36.pyc,,
|
||||
sqlalchemy/engine/__pycache__/threadlocal.cpython-36.pyc,,
|
||||
sqlalchemy/engine/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/event/__pycache__/attr.cpython-36.pyc,,
|
||||
sqlalchemy/event/__pycache__/base.cpython-36.pyc,,
|
||||
sqlalchemy/event/__pycache__/registry.cpython-36.pyc,,
|
||||
sqlalchemy/event/__pycache__/legacy.cpython-36.pyc,,
|
||||
sqlalchemy/event/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/event/__pycache__/api.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/util.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/elements.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/operators.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/selectable.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/crud.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/visitors.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/expression.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/functions.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/naming.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/compiler.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/ddl.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/base.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/annotation.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/type_api.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/schema.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/dml.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/sqltypes.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/__init__.cpython-36.pyc,,
|
||||
sqlalchemy/sql/__pycache__/default_comparator.cpython-36.pyc,,
|
|
@ -1,5 +0,0 @@
|
|||
Wheel-Version: 1.0
|
||||
Generator: bdist_wheel (0.31.0)
|
||||
Root-Is-Purelib: false
|
||||
Tag: cp36-cp36m-macosx_10_13_x86_64
|
||||
|
|
@ -1 +0,0 @@
|
|||
sqlalchemy
|
|
@ -1,80 +0,0 @@
|
|||
Werkzeug
|
||||
========
|
||||
|
||||
Werkzeug is a comprehensive `WSGI`_ web application library. It began as
|
||||
a simple collection of various utilities for WSGI applications and has
|
||||
become one of the most advanced WSGI utility libraries.
|
||||
|
||||
It includes:
|
||||
|
||||
* An interactive debugger that allows inspecting stack traces and source
|
||||
code in the browser with an interactive interpreter for any frame in
|
||||
the stack.
|
||||
* A full-featured request object with objects to interact with headers,
|
||||
query args, form data, files, and cookies.
|
||||
* A response object that can wrap other WSGI applications and handle
|
||||
streaming data.
|
||||
* A routing system for matching URLs to endpoints and generating URLs
|
||||
for endpoints, with an extensible system for capturing variables from
|
||||
URLs.
|
||||
* HTTP utilities to handle entity tags, cache control, dates, user
|
||||
agents, cookies, files, and more.
|
||||
* A threaded WSGI server for use while developing applications locally.
|
||||
* A test client for simulating HTTP requests during testing without
|
||||
requiring running a server.
|
||||
|
||||
Werkzeug is Unicode aware and doesn't enforce any dependencies. It is up
|
||||
to the developer to choose a template engine, database adapter, and even
|
||||
how to handle requests. It can be used to build all sorts of end user
|
||||
applications such as blogs, wikis, or bulletin boards.
|
||||
|
||||
`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while
|
||||
providing more structure and patterns for defining powerful
|
||||
applications.
|
||||
|
||||
|
||||
Installing
|
||||
----------
|
||||
|
||||
Install and update using `pip`_:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
pip install -U Werkzeug
|
||||
|
||||
|
||||
A Simple Example
|
||||
----------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from werkzeug.wrappers import Request, Response
|
||||
|
||||
@Request.application
|
||||
def application(request):
|
||||
return Response('Hello, World!')
|
||||
|
||||
if __name__ == '__main__':
|
||||
from werkzeug.serving import run_simple
|
||||
run_simple('localhost', 4000, application)
|
||||
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* Website: https://www.palletsprojects.com/p/werkzeug/
|
||||
* Releases: https://pypi.org/project/Werkzeug/
|
||||
* Code: https://github.com/pallets/werkzeug
|
||||
* Issue tracker: https://github.com/pallets/werkzeug/issues
|
||||
* Test status:
|
||||
|
||||
* Linux, Mac: https://travis-ci.org/pallets/werkzeug
|
||||
* Windows: https://ci.appveyor.com/project/davidism/werkzeug
|
||||
|
||||
* Test coverage: https://codecov.io/gh/pallets/werkzeug
|
||||
|
||||
.. _WSGI: https://wsgi.readthedocs.io/en/latest/
|
||||
.. _Flask: https://www.palletsprojects.com/p/flask/
|
||||
.. _pip: https://pip.pypa.io/en/stable/quickstart/
|
||||
|
||||
|
|
@ -1 +0,0 @@
|
|||
pip
|
|
@ -1,31 +0,0 @@
|
|||
Copyright © 2007 by the Pallets team.
|
||||
|
||||
Some rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
|
||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
THIS SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGE.
|
|
@ -1,116 +0,0 @@
|
|||
Metadata-Version: 2.0
|
||||
Name: Werkzeug
|
||||
Version: 0.14.1
|
||||
Summary: The comprehensive WSGI web application library.
|
||||
Home-page: https://www.palletsprojects.org/p/werkzeug/
|
||||
Author: Armin Ronacher
|
||||
Author-email: armin.ronacher@active-4.com
|
||||
License: BSD
|
||||
Description-Content-Type: UNKNOWN
|
||||
Platform: any
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Environment :: Web Environment
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: BSD License
|
||||
Classifier: Operating System :: OS Independent
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 2
|
||||
Classifier: Programming Language :: Python :: 2.6
|
||||
Classifier: Programming Language :: Python :: 2.7
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.3
|
||||
Classifier: Programming Language :: Python :: 3.4
|
||||
Classifier: Programming Language :: Python :: 3.5
|
||||
Classifier: Programming Language :: Python :: 3.6
|
||||
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||
Provides-Extra: dev
|
||||
Requires-Dist: coverage; extra == 'dev'
|
||||
Requires-Dist: pytest; extra == 'dev'
|
||||
Requires-Dist: sphinx; extra == 'dev'
|
||||
Requires-Dist: tox; extra == 'dev'
|
||||
Provides-Extra: termcolor
|
||||
Requires-Dist: termcolor; extra == 'termcolor'
|
||||
Provides-Extra: watchdog
|
||||
Requires-Dist: watchdog; extra == 'watchdog'
|
||||
|
||||
Werkzeug
|
||||
========
|
||||
|
||||
Werkzeug is a comprehensive `WSGI`_ web application library. It began as
|
||||
a simple collection of various utilities for WSGI applications and has
|
||||
become one of the most advanced WSGI utility libraries.
|
||||
|
||||
It includes:
|
||||
|
||||
* An interactive debugger that allows inspecting stack traces and source
|
||||
code in the browser with an interactive interpreter for any frame in
|
||||
the stack.
|
||||
* A full-featured request object with objects to interact with headers,
|
||||
query args, form data, files, and cookies.
|
||||
* A response object that can wrap other WSGI applications and handle
|
||||
streaming data.
|
||||
* A routing system for matching URLs to endpoints and generating URLs
|
||||
for endpoints, with an extensible system for capturing variables from
|
||||
URLs.
|
||||
* HTTP utilities to handle entity tags, cache control, dates, user
|
||||
agents, cookies, files, and more.
|
||||
* A threaded WSGI server for use while developing applications locally.
|
||||
* A test client for simulating HTTP requests during testing without
|
||||
requiring running a server.
|
||||
|
||||
Werkzeug is Unicode aware and doesn't enforce any dependencies. It is up
|
||||
to the developer to choose a template engine, database adapter, and even
|
||||
how to handle requests. It can be used to build all sorts of end user
|
||||
applications such as blogs, wikis, or bulletin boards.
|
||||
|
||||
`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while
|
||||
providing more structure and patterns for defining powerful
|
||||
applications.
|
||||
|
||||
|
||||
Installing
|
||||
----------
|
||||
|
||||
Install and update using `pip`_:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
pip install -U Werkzeug
|
||||
|
||||
|
||||
A Simple Example
|
||||
----------------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from werkzeug.wrappers import Request, Response
|
||||
|
||||
@Request.application
|
||||
def application(request):
|
||||
return Response('Hello, World!')
|
||||
|
||||
if __name__ == '__main__':
|
||||
from werkzeug.serving import run_simple
|
||||
run_simple('localhost', 4000, application)
|
||||
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* Website: https://www.palletsprojects.com/p/werkzeug/
|
||||
* Releases: https://pypi.org/project/Werkzeug/
|
||||
* Code: https://github.com/pallets/werkzeug
|
||||
* Issue tracker: https://github.com/pallets/werkzeug/issues
|
||||
* Test status:
|
||||
|
||||
* Linux, Mac: https://travis-ci.org/pallets/werkzeug
|
||||
* Windows: https://ci.appveyor.com/project/davidism/werkzeug
|
||||
|
||||
* Test coverage: https://codecov.io/gh/pallets/werkzeug
|
||||
|
||||
.. _WSGI: https://wsgi.readthedocs.io/en/latest/
|
||||
.. _Flask: https://www.palletsprojects.com/p/flask/
|
||||
.. _pip: https://pip.pypa.io/en/stable/quickstart/
|
||||
|
||||
|
|
@ -1,97 +0,0 @@
|
|||
Werkzeug-0.14.1.dist-info/DESCRIPTION.rst,sha256=rOCN36jwsWtWsTpqPG96z7FMilB5qI1CIARSKRuUmz8,2452
|
||||
Werkzeug-0.14.1.dist-info/LICENSE.txt,sha256=xndz_dD4m269AF9l_Xbl5V3tM1N3C1LoZC2PEPxWO-8,1534
|
||||
Werkzeug-0.14.1.dist-info/METADATA,sha256=FbfadrPdJNUWAxMOKxGUtHe5R3IDSBKYYmAz3FvI3uY,3872
|
||||
Werkzeug-0.14.1.dist-info/RECORD,,
|
||||
Werkzeug-0.14.1.dist-info/WHEEL,sha256=GrqQvamwgBV4nLoJe0vhYRSWzWsx7xjlt74FT0SWYfE,110
|
||||
Werkzeug-0.14.1.dist-info/metadata.json,sha256=4489UTt6HBp2NQil95-pBkjU4Je93SMHvMxZ_rjOpqA,1452
|
||||
Werkzeug-0.14.1.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9
|
||||
werkzeug/__init__.py,sha256=NR0d4n_-U9BLVKlOISean3zUt2vBwhvK-AZE6M0sC0k,6842
|
||||
werkzeug/_compat.py,sha256=8c4U9o6A_TR9nKCcTbpZNxpqCXcXDVIbFawwKM2s92c,6311
|
||||
werkzeug/_internal.py,sha256=GhEyGMlsSz_tYjsDWO9TG35VN7304MM8gjKDrXLEdVc,13873
|
||||
werkzeug/_reloader.py,sha256=AyPphcOHPbu6qzW0UbrVvTDJdre5WgpxbhIJN_TqzUc,9264
|
||||
werkzeug/datastructures.py,sha256=3IgNKNqrz-ZjmAG7y3YgEYK-enDiMT_b652PsypWcYg,90080
|
||||
werkzeug/exceptions.py,sha256=3wp95Hqj9FqV8MdikV99JRcHse_fSMn27V8tgP5Hw2c,20505
|
||||
werkzeug/filesystem.py,sha256=hHWeWo_gqLMzTRfYt8-7n2wWcWUNTnDyudQDLOBEICE,2175
|
||||
werkzeug/formparser.py,sha256=mUuCwjzjb8_E4RzrAT2AioLuZSYpqR1KXTK6LScRYzA,21722
|
||||
werkzeug/http.py,sha256=RQg4MJuhRv2isNRiEh__Phh09ebpfT3Kuu_GfrZ54_c,40079
|
||||
werkzeug/local.py,sha256=QdQhWV5L8p1Y1CJ1CDStwxaUs24SuN5aebHwjVD08C8,14553
|
||||
werkzeug/posixemulation.py,sha256=xEF2Bxc-vUCPkiu4IbfWVd3LW7DROYAT-ExW6THqyzw,3519
|
||||
werkzeug/routing.py,sha256=2JVtdSgxKGeANy4Z_FP-dKESvKtkYGCZ1J2fARCLGCY,67214
|
||||
werkzeug/script.py,sha256=DwaVDcXdaOTffdNvlBdLitxWXjKaRVT32VbhDtljFPY,11365
|
||||
werkzeug/security.py,sha256=0m107exslz4QJLWQCpfQJ04z3re4eGHVggRvrQVAdWc,9193
|
||||
werkzeug/serving.py,sha256=A0flnIJHufdn2QJ9oeuHfrXwP3LzP8fn3rNW6hbxKUg,31926
|
||||
werkzeug/test.py,sha256=XmECSmnpASiYQTct4oMiWr0LT5jHWCtKqnpYKZd2ui8,36100
|
||||
werkzeug/testapp.py,sha256=3HQRW1sHZKXuAjCvFMet4KXtQG3loYTFnvn6LWt-4zI,9396
|
||||
werkzeug/urls.py,sha256=dUeLg2IeTm0WLmSvFeD4hBZWGdOs-uHudR5-t8n9zPo,36771
|
||||
werkzeug/useragents.py,sha256=BhYMf4cBTHyN4U0WsQedePIocmNlH_34C-UwqSThGCc,5865
|
||||
werkzeug/utils.py,sha256=BrY1j0DHQ8RTb0K1StIobKuMJhN9SQQkWEARbrh2qpk,22972
|
||||
werkzeug/websocket.py,sha256=PpSeDxXD_0UsPAa5hQhQNM6mxibeUgn8lA8eRqiS0vM,11344
|
||||
werkzeug/wrappers.py,sha256=kbyL_aFjxELwPgMwfNCYjKu-CR6kNkh-oO8wv3GXbk8,84511
|
||||
werkzeug/wsgi.py,sha256=1Nob-aeChWQf7MsiicO8RZt6J90iRzEcik44ev9Qu8s,49347
|
||||
werkzeug/contrib/__init__.py,sha256=f7PfttZhbrImqpr5Ezre8CXgwvcGUJK7zWNpO34WWrw,623
|
||||
werkzeug/contrib/atom.py,sha256=qqfJcfIn2RYY-3hO3Oz0aLq9YuNubcPQ_KZcNsDwVJo,15575
|
||||
werkzeug/contrib/cache.py,sha256=xBImHNj09BmX_7kC5NUCx8f_l4L8_O7zi0jCL21UZKE,32163
|
||||
werkzeug/contrib/fixers.py,sha256=gR06T-w71ur-tHQ_31kP_4jpOncPJ4Wc1dOqTvYusr8,10179
|
||||
werkzeug/contrib/iterio.py,sha256=RlqDvGhz0RneTpzE8dVc-yWCUv4nkPl1jEc_EDp2fH0,10814
|
||||
werkzeug/contrib/jsrouting.py,sha256=QTmgeDoKXvNK02KzXgx9lr3cAH6fAzpwF5bBdPNvJPs,8564
|
||||
werkzeug/contrib/limiter.py,sha256=iS8-ahPZ-JLRnmfIBzxpm7O_s3lPsiDMVWv7llAIDCI,1334
|
||||
werkzeug/contrib/lint.py,sha256=Mj9NeUN7s4zIUWeQOAVjrmtZIcl3Mm2yDe9BSIr9YGE,12558
|
||||
werkzeug/contrib/profiler.py,sha256=ISwCWvwVyGpDLRBRpLjo_qUWma6GXYBrTAco4PEQSHY,5151
|
||||
werkzeug/contrib/securecookie.py,sha256=uWMyHDHY3lkeBRiCSayGqWkAIy4a7xAbSE_Hln9ecqc,12196
|
||||
werkzeug/contrib/sessions.py,sha256=39LVNvLbm5JWpbxM79WC2l87MJFbqeISARjwYbkJatw,12577
|
||||
werkzeug/contrib/testtools.py,sha256=G9xN-qeihJlhExrIZMCahvQOIDxdL9NiX874jiiHFMs,2453
|
||||
werkzeug/contrib/wrappers.py,sha256=v7OYlz7wQtDlS9fey75UiRZ1IkUWqCpzbhsLy4k14Hw,10398
|
||||
werkzeug/debug/__init__.py,sha256=uSn9BqCZ5E3ySgpoZtundpROGsn-uYvZtSFiTfAX24M,17452
|
||||
werkzeug/debug/console.py,sha256=n3-dsKk1TsjnN-u4ZgmuWCU_HO0qw5IA7ttjhyyMM6I,5607
|
||||
werkzeug/debug/repr.py,sha256=bKqstDYGfECpeLerd48s_hxuqK4b6UWnjMu3d_DHO8I,9340
|
||||
werkzeug/debug/tbtools.py,sha256=rBudXCmkVdAKIcdhxANxgf09g6kQjJWW9_5bjSpr4OY,18451
|
||||
werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673
|
||||
werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507
|
||||
werkzeug/debug/shared/debugger.js,sha256=PKPVYuyO4SX1hkqLOwCLvmIEO5154WatFYaXE-zIfKI,6264
|
||||
werkzeug/debug/shared/jquery.js,sha256=7LkWEzqTdpEfELxcZZlS6wAx5Ff13zZ83lYO2_ujj7g,95957
|
||||
werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191
|
||||
werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200
|
||||
werkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818
|
||||
werkzeug/debug/shared/style.css,sha256=IEO0PC2pWmh2aEyGCaN--txuWsRCliuhlbEhPDFwh0A,6270
|
||||
werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220
|
||||
Werkzeug-0.14.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
werkzeug/__pycache__/posixemulation.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/exceptions.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/websocket.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/datastructures.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/filesystem.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/useragents.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/serving.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/testapp.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/_compat.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/script.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/security.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/_internal.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/routing.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/_reloader.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/local.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/http.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/utils.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/wsgi.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/formparser.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/wrappers.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/__init__.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/test.cpython-36.pyc,,
|
||||
werkzeug/__pycache__/urls.cpython-36.pyc,,
|
||||
werkzeug/contrib/__pycache__/sessions.cpython-36.pyc,,
|
||||
werkzeug/contrib/__pycache__/lint.cpython-36.pyc,,
|
||||
werkzeug/contrib/__pycache__/jsrouting.cpython-36.pyc,,
|
||||
werkzeug/contrib/__pycache__/iterio.cpython-36.pyc,,
|
||||
werkzeug/contrib/__pycache__/testtools.cpython-36.pyc,,
|
||||
werkzeug/contrib/__pycache__/securecookie.cpython-36.pyc,,
|
||||
werkzeug/contrib/__pycache__/fixers.cpython-36.pyc,,
|
||||
werkzeug/contrib/__pycache__/profiler.cpython-36.pyc,,
|
||||
werkzeug/contrib/__pycache__/cache.cpython-36.pyc,,
|
||||
werkzeug/contrib/__pycache__/limiter.cpython-36.pyc,,
|
||||
werkzeug/contrib/__pycache__/wrappers.cpython-36.pyc,,
|
||||
werkzeug/contrib/__pycache__/__init__.cpython-36.pyc,,
|
||||
werkzeug/contrib/__pycache__/atom.cpython-36.pyc,,
|
||||
werkzeug/debug/__pycache__/repr.cpython-36.pyc,,
|
||||
werkzeug/debug/__pycache__/console.cpython-36.pyc,,
|
||||
werkzeug/debug/__pycache__/tbtools.cpython-36.pyc,,
|
||||
werkzeug/debug/__pycache__/__init__.cpython-36.pyc,,
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue