{ "info": { "author": "tell-k", "author_email": "ffk2005@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Internet :: WWW/HTTP", "Topic :: Software Development :: Libraries" ], "description": "WSGI Middleware and web framework extensions for handling User-Agent. Thanks to `woothee `_ , UADetector supports various User-Agents. This library respects to `k0kubun/rack-user_agent `_ .\n\n|travis| |coveralls| |version| |license|\n\nInstallation\n===================\n\n::\n\n $ pip install uadetector\n\n\nUsage\n=====================\n\nWSGI middleware\n----------------------\n\nThis middleware provides a ``uadetector.useragent.UserAgent`` object to handling User-agents. \n\n.. code-block:: python\n\n from wsgiref.simple_server import make_server\n\n # import middleware\n from uadetector import UADetector\n\n def app(environ, start_response):\n start_response('200 OK', [('Content-Type', 'text/plain')])\n\n # get 'UserAgent' object from environ dict.\n ua = environ.get('uadetector.useragent')\n\n ua.user_agent #=> \"Mozilla/5.0 (Macintosh; ...\"\n ua.device_type #=> \"pc\"\n ua.os #=> \"Mac OSX\"\n ua.browser #=> \"Chrome\"\n ua.from_pc #=> True\n ua.from_smartphone #=> False\n\n return [ua.os.encode('utf-8')]\n\n # Apply middleware\n application = UADetector(app)\n\n if __name__ == \"__main__\":\n with make_server('127.0.0.1', 8000, application) as server:\n print(\"Serving on port 8000...\")\n server.serve_forever()\n\nYou can also replace the key of ``environ`` or the ``UserAgent`` class.\n\n.. code-block:: python\n\n from uadetector.useragent import UserAgent\n\n class MyUserAgent(UserAgent):\n # Write your custom codes.\n\n # Apply middleware\n application = UADetector(\n app,\n envorion_key='your.favorite.key'\n useragent_class='path.to.MyUserAgent'\n )\n\nSee also `WSGI example `_.\n\nWeb framework extensions\n--------------------------------\n\nSome web frameworks provide a way to extend in a different way from WSGI Middleware. This library provide shortcuts according to that way.\n\n**Caution: I do not actively support individual frameworks. If you are worried, you should use WSGIMiddleware.**\n\nDjango\n~~~~~~~~~\n\nYou can use Django's ``MIDDLEWARE``.\n\n.. code-block:: python\n\n # settings.py\n\n MIDDLEWARE = [\n # Add UADetecorMiddleware\n 'uadetector.django.middleware.UADetectorMiddleware',\n # ... omit ...\n ]\n\n.. code-block:: python\n\n # views.py\n\n def index_view(request):\n print(request.ua.from_smartphone) # => True or False\n # ... omit ...\n\nCustomize property name of request object and replace UserAgent class.\n\n.. code-block:: python\n\n # settings.py\n\n UADETECTOR_REQUEST_PROPERTY_NAME = 'agent' # => You can use \"request.agent\"\n UADETECTOR_USERAGENT_CLASS = 'path.to.MyUserAgent'\n\nSee also `Dajngo example `_.\n\nTips: `Switch templates based on User-Agent `_ (using `django-variantmpl `_ ).\n\nPyramid\n~~~~~~~~~\n\nYou can use ``config.add_request_method``.\n\n.. code-block:: python\n\n from uadetector.pyramid import ua_prop\n\n\n def index(request):\n print(request.ua.from_smartphone) # => True or False\n # ... omit ...\n\n\n with Configurator() as config:\n config.add_route('index', '/')\n config.add_view(index, route_name='index')\n\n config.add_request_method(ua_prop(), name='ua', reify=True)\n # ... omit ...\n\nCustomize property name of request object and replace UserAgent class.\n\n.. code-block:: python\n\n config.add_request_method(\n ua_prop('path.to.MyUserAgent'),\n name='agent', # => You can use \"request.agent\"\n reify=True\n )\n\nSee also `Pyramid example `_.\n\nFlask\n~~~~~~~~~\n\nYou can use ``Flask Extension``.\n\n.. code-block:: python\n\n from flask import Flask, request\n from uadetector.flask import UADetector\n\n app = Flask(__name__)\n UADetector(app)\n\n @app.route('/')\n def index():\n print(request.ua.from_smartphone) # => True or False\n # ... omit ...\n\nCustomize property name of request object and replace UserAgent class.\n\n.. code-block:: python\n\n app = Flask(__name__)\n\n app.config['UADETECTOR_USERAGENT_CLASS'] = 'path.to.MyUserAgent'\n app.config['UADETECTOR_REQUEST_PROPERTY_NAME'] = 'agent' # => You can use \"request.agent\"\n\n UADetector(app)\n\nSee also `Flask example `_.\n\nTornado\n~~~~~~~~~\n\nYou can use custom ``RequestHandler``.\n\n.. code-block:: python\n\n from uadetector.tornado.web import RequestHandler\n\n class IndexHandler(RequestHandler):\n\n def get(self):\n print(self.request.ua.from_smartphone) # => True or False\n # ... omit ...\n\nCustomize property name of request object and replace UserAgent class.\n\n.. code-block:: python\n\n from tornado.options import define\n from uadetector.tornado.web import RequestHandler\n\n define(\n 'uadetector_request_property_name',\n default='agent', # => You can use \"self.request.agent\"\n )\n define(\n 'uadetector_useragent_class',\n default='path.to.MyUserAgent'\n )\n\n class IndexHandler(RequestHandler):\n\nSee also `Tornado example `_.\n\nUserAgent\n===================\n\nList of properties of ``uadetector.useragent.UserAgent`` object.\n\nattrs\n-----------\n\n* UserAgent.device_variant\n* UserAgent.device_type\n* UserAgent.os\n* UserAgent.os_version\n* UserAgent.browser\n* UserAgent.browser_version\n* UserAgent.browser_vendor\n\nhelpers\n-----------\n\n* UserAgent.from_pc\n* UserAgent.from_smartphone\n* UserAgent.from_mobilephone\n* UserAgent.from_appliance\n* UserAgent.from_crawler\n\ndetectors\n-----------\n\n* UserAgent.smartphone_version\n* UserAgent.from_iphone\n* UserAgent.from_ipad\n* UserAgent.from_ipod\n* UserAgent.from_android\n* UserAgent.from_android_tablet\n* UserAgent.from_windows_phone\n* UserAgent.from_ios\n* UserAgent.from_android_os\n\nTips\n===================\n\nIf you want a ``UserAgent`` object simply from the User-Agent string, Please use ``get_useruseragent``.\n\n.. code-block:: python\n\n from uadetector import get_useragent\n\n ua_string = \"Mozilla/5.0 (iPhone; CPU iPhone OS ...\"\n\n ua = get_useragent(ua_string)\n us.from_smartphone # => True\n\n # Use custom useragent class\n ua = get_useragent(ua_string, useragent_class='path.to.MyUserAgent')\n\nSupport\n========\n\nSupport latest 3 minor versions.\n\n* Python 3.4, 3.5, 3.6\n* Django 1.10, 1.11, 2.0\n* Pyramid 1.7, 1.8, 1.9\n* Flask 0.10, 0.11, 0.12\n* Tornado 4.5, 4.6, 4.7\n\nLicense\n========\n\nMIT License\n\nAuthors\n=======\n\n* tell-k \n\nHistory\n=======\n\n0.1.3(Feb 20, 2018)\n---------------------\n\n* `Lazy parsing User-Agent string `_ .\n\n0.1.2(Feb 19, 2018)\n---------------------\n\n* First release\n\n\n.. |travis| image:: https://travis-ci.org/tell-k/uadetector.svg?branch=master\n :target: https://travis-ci.org/tell-k/uadetector\n\n.. |coveralls| image:: https://coveralls.io/repos/tell-k/uadetector/badge.png\n :target: https://coveralls.io/r/tell-k/uadetector\n :alt: coveralls.io\n\n.. |version| image:: https://img.shields.io/pypi/v/uadetector.svg\n :target: http://pypi.python.org/pypi/uadetector/\n :alt: latest version\n\n.. |license| image:: https://img.shields.io/pypi/l/uadetector.svg\n :target: http://pypi.python.org/pypi/uadetector/\n :alt: license\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/tell-k/uadetector", "keywords": "user_agent,web,browser,detector,handling", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "uadetector", "package_url": "https://pypi.org/project/uadetector/", "platform": "", "project_url": "https://pypi.org/project/uadetector/", "project_urls": { "Homepage": "https://github.com/tell-k/uadetector" }, "release_url": "https://pypi.org/project/uadetector/0.1.3/", "requires_dist": [ "woothee" ], "requires_python": "", "summary": "WSGI Middleware and web framework extensions for handling User-Agent.", "version": "0.1.3" }, "last_serial": 3598734, "releases": { "0.1.2": [ { "comment_text": "", "digests": { "md5": "e11c70a5a7fc73642a6b549ad01273f0", "sha256": "62d5197e3f03ea89a22f2bd33467379e4328d39582b6040015298bc4c86e786f" }, "downloads": -1, "filename": "uadetector-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "e11c70a5a7fc73642a6b549ad01273f0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12885, "upload_time": "2018-02-18T17:42:52", "url": "https://files.pythonhosted.org/packages/95/fe/5ccc74eb340fbbc8140d564d742fcafc794457a8cbf8fe6de6104b083dc0/uadetector-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "98b5dea52e55cb39daf9c1d8bc9fbe3c", "sha256": "4b20a00b5093e274359f0b34b485fd224ca45330267f57546be4b30d667256dd" }, "downloads": -1, "filename": "uadetector-0.1.2.tar.gz", "has_sig": false, "md5_digest": "98b5dea52e55cb39daf9c1d8bc9fbe3c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16125, "upload_time": "2018-02-18T17:42:54", "url": "https://files.pythonhosted.org/packages/8e/7c/fda73e2a580cf004bfa4026706b7fe7e6ceac913f3bfd03631db3eada5fb/uadetector-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "ec1b91d1f59daa2571550be51a736f63", "sha256": "ef127eaae91bdbed626563878890c18be3b65153ab3d648e1fd4d917848a7d2c" }, "downloads": -1, "filename": "uadetector-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "ec1b91d1f59daa2571550be51a736f63", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13093, "upload_time": "2018-02-20T11:21:24", "url": "https://files.pythonhosted.org/packages/54/cf/bc4833a8da4c8641a5414f5359352ef5e48af28f6848c95d0a55a906a175/uadetector-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "56ede6bbfce13a24e03eedc34340f5b9", "sha256": "90058ed9cde3da208ae37cf6781daf9dfbabebd6947d5549be83d91a5c687a0b" }, "downloads": -1, "filename": "uadetector-0.1.3.tar.gz", "has_sig": false, "md5_digest": "56ede6bbfce13a24e03eedc34340f5b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16310, "upload_time": "2018-02-20T11:21:26", "url": "https://files.pythonhosted.org/packages/36/dc/2a243a546e7b8e982f9a98cdaabc414c48853180c68039a4f5783feeb34f/uadetector-0.1.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ec1b91d1f59daa2571550be51a736f63", "sha256": "ef127eaae91bdbed626563878890c18be3b65153ab3d648e1fd4d917848a7d2c" }, "downloads": -1, "filename": "uadetector-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "ec1b91d1f59daa2571550be51a736f63", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13093, "upload_time": "2018-02-20T11:21:24", "url": "https://files.pythonhosted.org/packages/54/cf/bc4833a8da4c8641a5414f5359352ef5e48af28f6848c95d0a55a906a175/uadetector-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "56ede6bbfce13a24e03eedc34340f5b9", "sha256": "90058ed9cde3da208ae37cf6781daf9dfbabebd6947d5549be83d91a5c687a0b" }, "downloads": -1, "filename": "uadetector-0.1.3.tar.gz", "has_sig": false, "md5_digest": "56ede6bbfce13a24e03eedc34340f5b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16310, "upload_time": "2018-02-20T11:21:26", "url": "https://files.pythonhosted.org/packages/36/dc/2a243a546e7b8e982f9a98cdaabc414c48853180c68039a4f5783feeb34f/uadetector-0.1.3.tar.gz" } ] }