mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-10-31 07:57:43 +03:00 
			
		
		
		
	Add rough django example
This commit is contained in:
		
							parent
							
								
									92a0ba4815
								
							
						
					
					
						commit
						cce1549993
					
				
							
								
								
									
										117
									
								
								examples/miniapps/django/README.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								examples/miniapps/django/README.rst
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,117 @@ | |||
| Dependency Injector + Sanic Example | ||||
| ===================================== | ||||
| 
 | ||||
| Application ``githubnavigator`` is a `Django <https://www.djangoproject.com/>`_ + | ||||
| `Dependency Injector <http://python-dependency-injector.ets-labs.org/>`_ example application. | ||||
| 
 | ||||
| Run | ||||
| --- | ||||
| 
 | ||||
| Create virtual environment: | ||||
| 
 | ||||
| .. code-block:: bash | ||||
| 
 | ||||
|    virtualenv venv | ||||
|    . venv/bin/activate | ||||
| 
 | ||||
| Install requirements: | ||||
| 
 | ||||
| .. code-block:: bash | ||||
| 
 | ||||
|     pip install -r requirements.txt | ||||
| 
 | ||||
| To run the application do: | ||||
| 
 | ||||
| .. code-block:: bash | ||||
| 
 | ||||
|     export GIPHY_API_KEY=wBJ2wZG7SRqfrU9nPgPiWvORmloDyuL0 | ||||
|     python -m giphynavigator | ||||
| 
 | ||||
| The output should be something like: | ||||
| 
 | ||||
| .. code-block:: | ||||
| 
 | ||||
|    [2020-09-23 18:16:31 -0400] [48258] [INFO] Goin' Fast @ http://0.0.0.0:8000 | ||||
|    [2020-09-23 18:16:31 -0400] [48258] [INFO] Starting worker [48258] | ||||
| 
 | ||||
| After that visit http://127.0.0.1:8000/ in your browser or use CLI command (``curl``, ``httpie``, | ||||
| etc). You should see something like: | ||||
| 
 | ||||
| .. code-block:: json | ||||
| 
 | ||||
|    { | ||||
|        "query": "Dependency Injector", | ||||
|        "limit": 10, | ||||
|        "gifs": [ | ||||
|            { | ||||
|                "url": "https://giphy.com/gifs/boxes-dependent-swbf2-6Eo7KzABxgJMY" | ||||
|            }, | ||||
|            { | ||||
|                "url": "https://giphy.com/gifs/depends-J56qCcOhk6hKE" | ||||
|            }, | ||||
|            { | ||||
|                "url": "https://giphy.com/gifs/web-series-ccstudios-bro-dependent-1lhU8KAVwmVVu" | ||||
|            }, | ||||
|            { | ||||
|                "url": "https://giphy.com/gifs/TheBoysTV-friends-friend-weneedeachother-XxR9qcIwcf5Jq404Sx" | ||||
|            }, | ||||
|            { | ||||
|                "url": "https://giphy.com/gifs/netflix-a-series-of-unfortunate-events-asoue-9rgeQXbwoK53pcxn7f" | ||||
|            }, | ||||
|            { | ||||
|                "url": "https://giphy.com/gifs/black-and-white-sad-skins-Hs4YzLs2zJuLu" | ||||
|            }, | ||||
|            { | ||||
|                "url": "https://giphy.com/gifs/always-there-for-you-i-am-here-PlayjhCco9jHBYrd9w" | ||||
|            }, | ||||
|            { | ||||
|                "url": "https://giphy.com/gifs/stream-famous-dollar-YT2dvOByEwXCdoYiA1" | ||||
|            }, | ||||
|            { | ||||
|                "url": "https://giphy.com/gifs/i-love-you-there-for-am-1BhGzgpZXYWwWMAGB1" | ||||
|            }, | ||||
|            { | ||||
|                "url": "https://giphy.com/gifs/life-like-twerk-9hlnWxjHqmH28" | ||||
|            } | ||||
|        ] | ||||
|    } | ||||
| 
 | ||||
| .. note:: | ||||
| 
 | ||||
|    To create your own Giphy API key follow this | ||||
|    `guide <https://support.giphy.com/hc/en-us/articles/360020283431-Request-A-GIPHY-API-Key>`_. | ||||
| 
 | ||||
| Test | ||||
| ---- | ||||
| 
 | ||||
| This application comes with the unit tests. | ||||
| 
 | ||||
| To run the tests do: | ||||
| 
 | ||||
| .. code-block:: bash | ||||
| 
 | ||||
|    py.test giphynavigator/tests.py --cov=giphynavigator | ||||
| 
 | ||||
| The output should be something like: | ||||
| 
 | ||||
| .. code-block:: | ||||
| 
 | ||||
|    platform darwin -- Python 3.8.3, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 | ||||
|    plugins: cov-2.10.0, sanic-1.6.1 | ||||
|    collected 3 items | ||||
| 
 | ||||
|    giphynavigator/tests.py ...                                     [100%] | ||||
| 
 | ||||
|    ---------- coverage: platform darwin, python 3.8.3-final-0 ----------- | ||||
|    Name                            Stmts   Miss  Cover | ||||
|    --------------------------------------------------- | ||||
|    giphynavigator/__init__.py          0      0   100% | ||||
|    giphynavigator/__main__.py          4      4     0% | ||||
|    giphynavigator/application.py      12      0   100% | ||||
|    giphynavigator/containers.py        6      0   100% | ||||
|    giphynavigator/giphy.py            14      9    36% | ||||
|    giphynavigator/handlers.py         10      0   100% | ||||
|    giphynavigator/services.py          9      1    89% | ||||
|    giphynavigator/tests.py            34      0   100% | ||||
|    --------------------------------------------------- | ||||
|    TOTAL                              89     14    84% | ||||
							
								
								
									
										
											BIN
										
									
								
								examples/miniapps/django/db.sqlite3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								examples/miniapps/django/db.sqlite3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										9
									
								
								examples/miniapps/django/githubnavigator/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								examples/miniapps/django/githubnavigator/__init__.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | |||
| """Main package.""" | ||||
| 
 | ||||
| from .containers import Container | ||||
| 
 | ||||
| 
 | ||||
| container = Container() | ||||
| container.config.github.request_timeout.override(5) | ||||
| container.config.default.query.override('Dependency Injector') | ||||
| container.config.default.limit.override(5) | ||||
							
								
								
									
										16
									
								
								examples/miniapps/django/githubnavigator/asgi.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								examples/miniapps/django/githubnavigator/asgi.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | |||
| """ | ||||
| ASGI config for githubnavigator project. | ||||
| 
 | ||||
| It exposes the ASGI callable as a module-level variable named ``application``. | ||||
| 
 | ||||
| For more information on this file, see | ||||
| https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/ | ||||
| """ | ||||
| 
 | ||||
| import os | ||||
| 
 | ||||
| from django.core.asgi import get_asgi_application | ||||
| 
 | ||||
| os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'githubnavigator.settings') | ||||
| 
 | ||||
| application = get_asgi_application() | ||||
							
								
								
									
										22
									
								
								examples/miniapps/django/githubnavigator/containers.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								examples/miniapps/django/githubnavigator/containers.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | |||
| """Containers module.""" | ||||
| 
 | ||||
| from dependency_injector import containers, providers | ||||
| from github import Github | ||||
| 
 | ||||
| from . import services | ||||
| 
 | ||||
| 
 | ||||
| class Container(containers.DeclarativeContainer): | ||||
| 
 | ||||
|     config = providers.Configuration() | ||||
| 
 | ||||
|     github_client = providers.Factory( | ||||
|         Github, | ||||
|         login_or_token=config.github.auth_token, | ||||
|         timeout=config.github.request_timeout, | ||||
|     ) | ||||
| 
 | ||||
|     search_service = providers.Factory( | ||||
|         services.SearchService, | ||||
|         github_client=github_client, | ||||
|     ) | ||||
							
								
								
									
										44
									
								
								examples/miniapps/django/githubnavigator/services.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								examples/miniapps/django/githubnavigator/services.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,44 @@ | |||
| """Services module.""" | ||||
| 
 | ||||
| from github import Github | ||||
| from github.Repository import Repository | ||||
| from github.Commit import Commit | ||||
| 
 | ||||
| 
 | ||||
| class SearchService: | ||||
|     """Search service performs search on Github.""" | ||||
| 
 | ||||
|     def __init__(self, github_client: Github): | ||||
|         self._github_client = github_client | ||||
| 
 | ||||
|     def search_repositories(self, query, limit): | ||||
|         """Search for repositories and return formatted data.""" | ||||
|         repositories = self._github_client.search_repositories( | ||||
|             query=query, | ||||
|             **{'in': 'name'}, | ||||
|         ) | ||||
|         return [ | ||||
|             self._format_repo(repository) | ||||
|             for repository in repositories[:limit] | ||||
|         ] | ||||
| 
 | ||||
|     def _format_repo(self, repository: Repository): | ||||
|         commits = repository.get_commits() | ||||
|         return { | ||||
|             'url': repository.html_url, | ||||
|             'name': repository.name, | ||||
|             'owner': { | ||||
|                 'login': repository.owner.login, | ||||
|                 'url': repository.owner.html_url, | ||||
|                 'avatar_url': repository.owner.avatar_url, | ||||
|             }, | ||||
|             'latest_commit': self._format_commit(commits[0]) if commits else {}, | ||||
|         } | ||||
| 
 | ||||
|     def _format_commit(self, commit: Commit): | ||||
|         return { | ||||
|             'sha': commit.sha, | ||||
|             'url': commit.html_url, | ||||
|             'message': commit.commit.message, | ||||
|             'author_name': commit.commit.author.name, | ||||
|         } | ||||
							
								
								
									
										121
									
								
								examples/miniapps/django/githubnavigator/settings.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								examples/miniapps/django/githubnavigator/settings.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,121 @@ | |||
| """ | ||||
| Django settings for githubnavigator project. | ||||
| 
 | ||||
| Generated by 'django-admin startproject' using Django 3.0.8. | ||||
| 
 | ||||
| For more information on this file, see | ||||
| https://docs.djangoproject.com/en/3.0/topics/settings/ | ||||
| 
 | ||||
| For the full list of settings and their values, see | ||||
| https://docs.djangoproject.com/en/3.0/ref/settings/ | ||||
| """ | ||||
| 
 | ||||
| import os | ||||
| 
 | ||||
| # Build paths inside the project like this: os.path.join(BASE_DIR, ...) | ||||
| BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | ||||
| 
 | ||||
| 
 | ||||
| # Quick-start development settings - unsuitable for production | ||||
| # See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ | ||||
| 
 | ||||
| # SECURITY WARNING: keep the secret key used in production secret! | ||||
| SECRET_KEY = ')6*iyg26c9l!fvyvwd&3+vyf-dcw)e=5x2t(j)(*c29z@ykhi0' | ||||
| 
 | ||||
| # SECURITY WARNING: don't run with debug turned on in production! | ||||
| DEBUG = True | ||||
| 
 | ||||
| ALLOWED_HOSTS = [] | ||||
| 
 | ||||
| 
 | ||||
| # Application definition | ||||
| 
 | ||||
| INSTALLED_APPS = [ | ||||
|     'web.apps.WebConfig', | ||||
|     'django.contrib.admin', | ||||
|     'django.contrib.auth', | ||||
|     'django.contrib.contenttypes', | ||||
|     'django.contrib.sessions', | ||||
|     'django.contrib.messages', | ||||
|     'django.contrib.staticfiles', | ||||
| ] | ||||
| 
 | ||||
| MIDDLEWARE = [ | ||||
|     'django.middleware.security.SecurityMiddleware', | ||||
|     'django.contrib.sessions.middleware.SessionMiddleware', | ||||
|     'django.middleware.common.CommonMiddleware', | ||||
|     'django.middleware.csrf.CsrfViewMiddleware', | ||||
|     'django.contrib.auth.middleware.AuthenticationMiddleware', | ||||
|     'django.contrib.messages.middleware.MessageMiddleware', | ||||
|     'django.middleware.clickjacking.XFrameOptionsMiddleware', | ||||
| ] | ||||
| 
 | ||||
| ROOT_URLCONF = 'githubnavigator.urls' | ||||
| 
 | ||||
| TEMPLATES = [ | ||||
|     { | ||||
|         'BACKEND': 'django.template.backends.django.DjangoTemplates', | ||||
|         'DIRS': [], | ||||
|         'APP_DIRS': True, | ||||
|         'OPTIONS': { | ||||
|             'context_processors': [ | ||||
|                 'django.template.context_processors.debug', | ||||
|                 'django.template.context_processors.request', | ||||
|                 'django.contrib.auth.context_processors.auth', | ||||
|                 'django.contrib.messages.context_processors.messages', | ||||
|             ], | ||||
|         }, | ||||
|     }, | ||||
| ] | ||||
| 
 | ||||
| WSGI_APPLICATION = 'githubnavigator.wsgi.application' | ||||
| 
 | ||||
| 
 | ||||
| # Database | ||||
| # https://docs.djangoproject.com/en/3.0/ref/settings/#databases | ||||
| 
 | ||||
| DATABASES = { | ||||
|     'default': { | ||||
|         'ENGINE': 'django.db.backends.sqlite3', | ||||
|         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| # Password validation | ||||
| # https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators | ||||
| 
 | ||||
| AUTH_PASSWORD_VALIDATORS = [ | ||||
|     { | ||||
|         'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', | ||||
|     }, | ||||
|     { | ||||
|         'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', | ||||
|     }, | ||||
|     { | ||||
|         'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', | ||||
|     }, | ||||
|     { | ||||
|         'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', | ||||
|     }, | ||||
| ] | ||||
| 
 | ||||
| 
 | ||||
| # Internationalization | ||||
| # https://docs.djangoproject.com/en/3.0/topics/i18n/ | ||||
| 
 | ||||
| LANGUAGE_CODE = 'en-us' | ||||
| 
 | ||||
| TIME_ZONE = 'UTC' | ||||
| 
 | ||||
| USE_I18N = True | ||||
| 
 | ||||
| USE_L10N = True | ||||
| 
 | ||||
| USE_TZ = True | ||||
| 
 | ||||
| 
 | ||||
| # Static files (CSS, JavaScript, Images) | ||||
| # https://docs.djangoproject.com/en/3.0/howto/static-files/ | ||||
| 
 | ||||
| STATIC_URL = '/static/' | ||||
							
								
								
									
										22
									
								
								examples/miniapps/django/githubnavigator/urls.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								examples/miniapps/django/githubnavigator/urls.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | |||
| """githubnavigator URL Configuration | ||||
| 
 | ||||
| The `urlpatterns` list routes URLs to views. For more information please see: | ||||
|     https://docs.djangoproject.com/en/3.0/topics/http/urls/ | ||||
| Examples: | ||||
| Function views | ||||
|     1. Add an import:  from my_app import views | ||||
|     2. Add a URL to urlpatterns:  path('', views.home, name='home') | ||||
| Class-based views | ||||
|     1. Add an import:  from other_app.views import Home | ||||
|     2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home') | ||||
| Including another URLconf | ||||
|     1. Import the include() function: from django.urls import include, path | ||||
|     2. Add a URL to urlpatterns:  path('blog/', include('blog.urls')) | ||||
| """ | ||||
| from django.contrib import admin | ||||
| from django.urls import path, include | ||||
| 
 | ||||
| urlpatterns = [ | ||||
|     path('', include('web.urls')), | ||||
|     path('admin/', admin.site.urls), | ||||
| ] | ||||
							
								
								
									
										16
									
								
								examples/miniapps/django/githubnavigator/wsgi.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								examples/miniapps/django/githubnavigator/wsgi.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | |||
| """ | ||||
| WSGI config for githubnavigator project. | ||||
| 
 | ||||
| It exposes the WSGI callable as a module-level variable named ``application``. | ||||
| 
 | ||||
| For more information on this file, see | ||||
| https://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/ | ||||
| """ | ||||
| 
 | ||||
| import os | ||||
| 
 | ||||
| from django.core.wsgi import get_wsgi_application | ||||
| 
 | ||||
| os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'githubnavigator.settings') | ||||
| 
 | ||||
| application = get_wsgi_application() | ||||
							
								
								
									
										21
									
								
								examples/miniapps/django/manage.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										21
									
								
								examples/miniapps/django/manage.py
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| #!/usr/bin/env python | ||||
| """Django's command-line utility for administrative tasks.""" | ||||
| import os | ||||
| import sys | ||||
| 
 | ||||
| 
 | ||||
| def main(): | ||||
|     os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'githubnavigator.settings') | ||||
|     try: | ||||
|         from django.core.management import execute_from_command_line | ||||
|     except ImportError as exc: | ||||
|         raise ImportError( | ||||
|             "Couldn't import Django. Are you sure it's installed and " | ||||
|             "available on your PYTHONPATH environment variable? Did you " | ||||
|             "forget to activate a virtual environment?" | ||||
|         ) from exc | ||||
|     execute_from_command_line(sys.argv) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     main() | ||||
							
								
								
									
										3
									
								
								examples/miniapps/django/requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								examples/miniapps/django/requirements.txt
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| dependency-injector | ||||
| django | ||||
| pygithub | ||||
							
								
								
									
										0
									
								
								examples/miniapps/django/web/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								examples/miniapps/django/web/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										12
									
								
								examples/miniapps/django/web/apps.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								examples/miniapps/django/web/apps.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | |||
| from django.apps import AppConfig | ||||
| from django.conf import settings | ||||
| 
 | ||||
| from githubnavigator import container | ||||
| from . import views | ||||
| 
 | ||||
| 
 | ||||
| class WebConfig(AppConfig): | ||||
|     name = 'web' | ||||
| 
 | ||||
|     def ready(self): | ||||
|         container.wire(modules=[views]) | ||||
							
								
								
									
										63
									
								
								examples/miniapps/django/web/templates/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								examples/miniapps/django/web/templates/index.html
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,63 @@ | |||
| <div class="container"> | ||||
|     <h1 class="mb-4">Github Navigator</h1> | ||||
| 
 | ||||
|     <form> | ||||
|         <div class="form-group form-row"> | ||||
|             <div class="col-10"> | ||||
|                 <label for="search_query" class="col-form-label"> | ||||
|                     Search for: | ||||
|                 </label> | ||||
|                 <input class="form-control" type="text" id="search_query" | ||||
|                        placeholder="Type something to search on the GitHub" | ||||
|                        name="query" | ||||
|                        value="{{ query }}"> | ||||
|             </div> | ||||
|             <div class="col"> | ||||
|                 <label for="search_limit" class="col-form-label"> | ||||
|                     Limit: | ||||
|                 </label> | ||||
|                 <select class="form-control" id="search_limit" name="limit"> | ||||
|                     {% for value in limits %} | ||||
|                     <option {% if value == limit %}selected{% endif %}> | ||||
|                         {{ value }} | ||||
|                     </option> | ||||
|                     {% endfor %} | ||||
|                 </select> | ||||
|             </div> | ||||
|         </div> | ||||
|     </form> | ||||
| 
 | ||||
|     <p><small>Results found: {{ repositories|length }}</small></p> | ||||
| 
 | ||||
|     <table class="table table-striped"> | ||||
|         <thead> | ||||
|         <tr> | ||||
|             <th>#</th> | ||||
|             <th>Repository</th> | ||||
|             <th class="text-nowrap">Repository owner</th> | ||||
|             <th class="text-nowrap">Last commit</th> | ||||
|         </tr> | ||||
|         </thead> | ||||
|         <tbody> | ||||
|         {% for repository in repositories %} {{n}} | ||||
|         <tr> | ||||
|             <th>{{ loop.index }}</th> | ||||
|             <td><a href="{{ repository.url }}"> | ||||
|                 {{ repository.name }}</a> | ||||
|             </td> | ||||
|             <td><a href="{{ repository.owner.url }}"> | ||||
|                 <img src="{{ repository.owner.avatar_url }}" | ||||
|                      alt="avatar" height="24" width="24"/></a> | ||||
|                 <a href="{{ repository.owner.url }}"> | ||||
|                     {{ repository.owner.login }}</a> | ||||
|             </td> | ||||
|             <td><a href="{{ repository.latest_commit.url }}"> | ||||
|                 {{ repository.latest_commit.sha }}</a> | ||||
|                 {{ repository.latest_commit.message }} | ||||
|                 {{ repository.latest_commit.author_name }} | ||||
|             </td> | ||||
|         </tr> | ||||
|         {% endfor %} | ||||
|         </tbody> | ||||
|     </table> | ||||
| </div> | ||||
							
								
								
									
										3
									
								
								examples/miniapps/django/web/tests.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								examples/miniapps/django/web/tests.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| from django.test import TestCase | ||||
| 
 | ||||
| # Create your tests here. | ||||
							
								
								
									
										7
									
								
								examples/miniapps/django/web/urls.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								examples/miniapps/django/web/urls.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,7 @@ | |||
| from django.urls import path | ||||
| 
 | ||||
| from . import views | ||||
| 
 | ||||
| urlpatterns = [ | ||||
|     path('', views.index, name='index'), | ||||
| ] | ||||
							
								
								
									
										31
									
								
								examples/miniapps/django/web/views.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								examples/miniapps/django/web/views.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,31 @@ | |||
| """Views module.""" | ||||
| 
 | ||||
| from django.http import HttpRequest, HttpResponse | ||||
| from django.shortcuts import render | ||||
| from dependency_injector.wiring import Provide | ||||
| 
 | ||||
| from githubnavigator.containers import Container | ||||
| from githubnavigator.services import SearchService | ||||
| 
 | ||||
| 
 | ||||
| def index( | ||||
|         request: HttpRequest, | ||||
|         search_service: SearchService = Provide[Container.search_service], | ||||
|         default_query: str = Provide[Container.config.default.query], | ||||
|         default_limit: int = Provide[Container.config.default.limit.as_int()], | ||||
| ) -> HttpResponse: | ||||
|     query = request.GET.get('query', default_query) | ||||
|     limit = int(request.GET.get('limit', default_limit)) | ||||
| 
 | ||||
|     repositories = search_service.search_repositories(query, limit) | ||||
| 
 | ||||
|     return render( | ||||
|         request, | ||||
|         template_name='index.html', | ||||
|         context={ | ||||
|             'query': query, | ||||
|             'limit': limit, | ||||
|             'limits': [5, 10, 20], | ||||
|             'repositories': repositories, | ||||
|         } | ||||
|     ) | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user