Repository files navigation

django-dynamicresponse

django-dynamicresponse is a lightweight framework for easily providing REST API's for Django applications.

The framework is intentionally very lightweight and minimalistic, and is designed to interoperate with existing Django code (such as form validation), without major changes.

In most cases, the only changes needed to add full REST API to an existing Django application is modifying the return statements in your views to return one of the response classes described below instead of a standard Django HttpResponse.

Features

  • Easy integration with existing code
  • Reuse same views and logic for both API and normal requests (no need for separate API handlers)
  • Decodes submitted JSON into request.POST, fully compatible with Django forms
  • Built-in support for HTTP Basic authentication

Installation

Install django-dynamicresponse:

pip install django-dynamicresponse

Alternatively, download the source code and manually add it to your PYTHONPATH.

Add the two middleware classes to MIDDLEWARE_CLASSES in your settings.py:

MIDDLEWARE_CLASSES = (
'dynamicresponse.middleware.api.APIMiddleware',
'dynamicresponse.middleware.dynamicformat.DynamicFormatMiddleware',
)

APIMiddleware detects incoming API requests based on HTTP headers and provides support for Basic authentication.

DynamicFormatMiddleware decodes incoming JSON content into request.POST, as well as rendering appropriate responses based on the returned value from your views.

Settings

These are the available configurable settings, along with their default values:

NameDefaultDescription
DYNAMICRESPONSE_JSON_FORM_ERRORSFalseOutputs form errors in JSON
DYNAMICRESPONSE_BASIC_REALM_NAME'API'The name of the Basic Auth realm
DYNAMICRESPONSE_DJANGO_USER_FIELDS('id', 'email', 'first_name', 'last_name')Defines which fields to include when serializing a Django auth User object

Tests

Run unit tests by running python setup.py test

Usage

See the included sample project for sample code using the framework to implement a simple blog application.

Import dynamicresponse in the views you want to use it:

from dynamicresponse.response import *

Return an instance of the appropriate response class depending on your view logic:

@login_required
def customer_list(request):
"""Lists all customers."""
customers = Customer.objects.all()
return SerializeOrRender('customers/list.html', { 'customers': customers })

The framework provides two response classes; SerializeOrRender and SerializeOrRedirect.

As the names imply, these response classes serialize the supplied context as JSON for API requests, and renders a template or redirects to a URL for normal requests. The first argument of both classes specifies the template to be rendered or the URL to redirect the user to.

To implement a REST API, you simply use SerializeOrRender in situations where you would typically use render_to_response, and SerializeOrRedirect in cases where you would otherwise return an HttpResponseRedirect instance.

For API requests, the second argument of the constructor is the context to be serialized for API requests. When rendering templates, it is often useful to pass additional context (such as forms and paginators) that is only useful when rendering the template, even though they are not relevant for API requests. The SerializeOrRender class supports additional context via a third argument, extra:

@login_required
def customer_list(request):
"""Lists all customers."""
customers = Customer.objects.all()
return SerializeOrRender('customers/list.html', { 'customers': customers }, extra={ 'somevalue': 'something' })

In this case, only customers are serialized in API responses, while both customers and somevalue is accessible when the template is rendered for normal requests.

Status codes

Content is normally returned as JSON with HTTP status code 200. If you want to return a different status code, set the status argument to one of the following values:

ConstantHTTP statusDescription
CR_OK200Default status
CR_INVALID_DATA400One or more forms are invalid
CR_NOT_FOUND404Not found (optional alternative to HttpResponseNotFound for consistency)
CR_CONFIRM405Confirm action with HTTP POST (use with SerializeOrRender with confirmation template)
CR_DELETED204The resource has been deleted

You can add custom status values by defining them as a tuple consisting of a string constant and the HTTP status code to return:

CR_REQUIRES_UPGRADE = ('REQUIRES_UPGRADE', 402)

Customizing serialization

By default, all fields not starting with an underscore (_) on the models will be serialized when returning a JSON response for API requests.

You can override this behavior by adding a serialize_fields method to your models, returning the fields to include:

class BlogPost(models.Model):
title = models.CharField('Title', max_length=255)
text = models.TextField('Text')
def serialize_fields(self):
"""Only these fields will be included in API responses."""
return [
'id',
'title',
'content',
]

This behavior also extends to nested objects. For instance, if the model above had included a foreign key to an author, only the fields defined in the author's serialize_fields method would have been included.

By default, callables are not included in the serialization. However, you can include names of callables in serialize_fields to explicitly include them in the serialization. This can for instance be useful to provide API users with useful dynamically computed information.

About

django-dynamicresponse is a lightweight framework for easily providing REST API's for web apps built with Django.

Resources

Stars

49 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

django-dynamicresponse

django-dynamicresponse is a lightweight framework for easily providing REST API's for Django applications.

The framework is intentionally very lightweight and minimalistic, and is designed to interoperate with existing Django code (such as form validation), without major changes.

In most cases, the only changes needed to add full REST API to an existing Django application is modifying the return statements in your views to return one of the response classes described below instead of a standard Django HttpResponse.

Features

  • Easy integration with existing code
  • Reuse same views and logic for both API and normal requests (no need for separate API handlers)
  • Decodes submitted JSON into request.POST, fully compatible with Django forms
  • Built-in support for HTTP Basic authentication

Installation

Install django-dynamicresponse:

pip install django-dynamicresponse

Alternatively, download the source code and manually add it to your PYTHONPATH.

Add the two middleware classes to MIDDLEWARE_CLASSES in your settings.py:

MIDDLEWARE_CLASSES = (
'dynamicresponse.middleware.api.APIMiddleware',
'dynamicresponse.middleware.dynamicformat.DynamicFormatMiddleware',
)

APIMiddleware detects incoming API requests based on HTTP headers and provides support for Basic authentication.

DynamicFormatMiddleware decodes incoming JSON content into request.POST, as well as rendering appropriate responses based on the returned value from your views.

Settings

These are the available configurable settings, along with their default values:

NameDefaultDescription
DYNAMICRESPONSE_JSON_FORM_ERRORSFalseOutputs form errors in JSON
DYNAMICRESPONSE_BASIC_REALM_NAME'API'The name of the Basic Auth realm
DYNAMICRESPONSE_DJANGO_USER_FIELDS('id', 'email', 'first_name', 'last_name')Defines which fields to include when serializing a Django auth User object

Tests

Run unit tests by running python setup.py test

Usage

See the included sample project for sample code using the framework to implement a simple blog application.

Import dynamicresponse in the views you want to use it:

from dynamicresponse.response import *

Return an instance of the appropriate response class depending on your view logic:

@login_required
def customer_list(request):
"""Lists all customers."""
customers = Customer.objects.all()
return SerializeOrRender('customers/list.html', { 'customers': customers })

The framework provides two response classes; SerializeOrRender and SerializeOrRedirect.

As the names imply, these response classes serialize the supplied context as JSON for API requests, and renders a template or redirects to a URL for normal requests. The first argument of both classes specifies the template to be rendered or the URL to redirect the user to.

To implement a REST API, you simply use SerializeOrRender in situations where you would typically use render_to_response, and SerializeOrRedirect in cases where you would otherwise return an HttpResponseRedirect instance.

For API requests, the second argument of the constructor is the context to be serialized for API requests. When rendering templates, it is often useful to pass additional context (such as forms and paginators) that is only useful when rendering the template, even though they are not relevant for API requests. The SerializeOrRender class supports additional context via a third argument, extra:

@login_required
def customer_list(request):
"""Lists all customers."""
customers = Customer.objects.all()
return SerializeOrRender('customers/list.html', { 'customers': customers }, extra={ 'somevalue': 'something' })

In this case, only customers are serialized in API responses, while both customers and somevalue is accessible when the template is rendered for normal requests.

Status codes

Content is normally returned as JSON with HTTP status code 200. If you want to return a different status code, set the status argument to one of the following values:

ConstantHTTP statusDescription
CR_OK200Default status
CR_INVALID_DATA400One or more forms are invalid
CR_NOT_FOUND404Not found (optional alternative to HttpResponseNotFound for consistency)
CR_CONFIRM405Confirm action with HTTP POST (use with SerializeOrRender with confirmation template)
CR_DELETED204The resource has been deleted

You can add custom status values by defining them as a tuple consisting of a string constant and the HTTP status code to return:

CR_REQUIRES_UPGRADE = ('REQUIRES_UPGRADE', 402)

Customizing serialization

By default, all fields not starting with an underscore (_) on the models will be serialized when returning a JSON response for API requests.

You can override this behavior by adding a serialize_fields method to your models, returning the fields to include:

class BlogPost(models.Model):
title = models.CharField('Title', max_length=255)
text = models.TextField('Text')
def serialize_fields(self):
"""Only these fields will be included in API responses."""
return [
'id',
'title',
'content',
]

This behavior also extends to nested objects. For instance, if the model above had included a foreign key to an author, only the fields defined in the author's serialize_fields method would have been included.

By default, callables are not included in the serialization. However, you can include names of callables in serialize_fields to explicitly include them in the serialization. This can for instance be useful to provide API users with useful dynamically computed information.

About

django-dynamicresponse is a lightweight framework for easily providing REST API's for web apps built with Django.

Resources

Stars

49 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

django-dynamicresponse

django-dynamicresponse is a lightweight framework for easily providing REST API's for Django applications.

The framework is intentionally very lightweight and minimalistic, and is designed to interoperate with existing Django code (such as form validation), without major changes.

In most cases, the only changes needed to add full REST API to an existing Django application is modifying the return statements in your views to return one of the response classes described below instead of a standard Django HttpResponse.

Features

  • Easy integration with existing code
  • Reuse same views and logic for both API and normal requests (no need for separate API handlers)
  • Decodes submitted JSON into request.POST, fully compatible with Django forms
  • Built-in support for HTTP Basic authentication

Installation

Install django-dynamicresponse:

pip install django-dynamicresponse

Alternatively, download the source code and manually add it to your PYTHONPATH.

Add the two middleware classes to MIDDLEWARE_CLASSES in your settings.py:

MIDDLEWARE_CLASSES = (
'dynamicresponse.middleware.api.APIMiddleware',
'dynamicresponse.middleware.dynamicformat.DynamicFormatMiddleware',
)

APIMiddleware detects incoming API requests based on HTTP headers and provides support for Basic authentication.

DynamicFormatMiddleware decodes incoming JSON content into request.POST, as well as rendering appropriate responses based on the returned value from your views.

Settings

These are the available configurable settings, along with their default values:

NameDefaultDescription
DYNAMICRESPONSE_JSON_FORM_ERRORSFalseOutputs form errors in JSON
DYNAMICRESPONSE_BASIC_REALM_NAME'API'The name of the Basic Auth realm
DYNAMICRESPONSE_DJANGO_USER_FIELDS('id', 'email', 'first_name', 'last_name')Defines which fields to include when serializing a Django auth User object

Tests

Run unit tests by running python setup.py test

Usage

See the included sample project for sample code using the framework to implement a simple blog application.

Import dynamicresponse in the views you want to use it:

from dynamicresponse.response import *

Return an instance of the appropriate response class depending on your view logic:

@login_required
def customer_list(request):
"""Lists all customers."""
customers = Customer.objects.all()
return SerializeOrRender('customers/list.html', { 'customers': customers })

The framework provides two response classes; SerializeOrRender and SerializeOrRedirect.

As the names imply, these response classes serialize the supplied context as JSON for API requests, and renders a template or redirects to a URL for normal requests. The first argument of both classes specifies the template to be rendered or the URL to redirect the user to.

To implement a REST API, you simply use SerializeOrRender in situations where you would typically use render_to_response, and SerializeOrRedirect in cases where you would otherwise return an HttpResponseRedirect instance.

For API requests, the second argument of the constructor is the context to be serialized for API requests. When rendering templates, it is often useful to pass additional context (such as forms and paginators) that is only useful when rendering the template, even though they are not relevant for API requests. The SerializeOrRender class supports additional context via a third argument, extra:

@login_required
def customer_list(request):
"""Lists all customers."""
customers = Customer.objects.all()
return SerializeOrRender('customers/list.html', { 'customers': customers }, extra={ 'somevalue': 'something' })

In this case, only customers are serialized in API responses, while both customers and somevalue is accessible when the template is rendered for normal requests.

Status codes

Content is normally returned as JSON with HTTP status code 200. If you want to return a different status code, set the status argument to one of the following values:

ConstantHTTP statusDescription
CR_OK200Default status
CR_INVALID_DATA400One or more forms are invalid
CR_NOT_FOUND404Not found (optional alternative to HttpResponseNotFound for consistency)
CR_CONFIRM405Confirm action with HTTP POST (use with SerializeOrRender with confirmation template)
CR_DELETED204The resource has been deleted

You can add custom status values by defining them as a tuple consisting of a string constant and the HTTP status code to return:

CR_REQUIRES_UPGRADE = ('REQUIRES_UPGRADE', 402)

Customizing serialization

By default, all fields not starting with an underscore (_) on the models will be serialized when returning a JSON response for API requests.

You can override this behavior by adding a serialize_fields method to your models, returning the fields to include:

class BlogPost(models.Model):
title = models.CharField('Title', max_length=255)
text = models.TextField('Text')
def serialize_fields(self):
"""Only these fields will be included in API responses."""
return [
'id',
'title',
'content',
]

This behavior also extends to nested objects. For instance, if the model above had included a foreign key to an author, only the fields defined in the author's serialize_fields method would have been included.

By default, callables are not included in the serialization. However, you can include names of callables in serialize_fields to explicitly include them in the serialization. This can for instance be useful to provide API users with useful dynamically computed information.

About

django-dynamicresponse is a lightweight framework for easily providing REST API's for web apps built with Django.

Resources

Stars

49 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

django-dynamicresponse

django-dynamicresponse is a lightweight framework for easily providing REST API's for Django applications.

The framework is intentionally very lightweight and minimalistic, and is designed to interoperate with existing Django code (such as form validation), without major changes.

In most cases, the only changes needed to add full REST API to an existing Django application is modifying the return statements in your views to return one of the response classes described below instead of a standard Django HttpResponse.

Features

  • Easy integration with existing code
  • Reuse same views and logic for both API and normal requests (no need for separate API handlers)
  • Decodes submitted JSON into request.POST, fully compatible with Django forms
  • Built-in support for HTTP Basic authentication

Installation

Install django-dynamicresponse:

pip install django-dynamicresponse

Alternatively, download the source code and manually add it to your PYTHONPATH.

Add the two middleware classes to MIDDLEWARE_CLASSES in your settings.py:

MIDDLEWARE_CLASSES = (
'dynamicresponse.middleware.api.APIMiddleware',
'dynamicresponse.middleware.dynamicformat.DynamicFormatMiddleware',
)

APIMiddleware detects incoming API requests based on HTTP headers and provides support for Basic authentication.

DynamicFormatMiddleware decodes incoming JSON content into request.POST, as well as rendering appropriate responses based on the returned value from your views.

Settings

These are the available configurable settings, along with their default values:

NameDefaultDescription
DYNAMICRESPONSE_JSON_FORM_ERRORSFalseOutputs form errors in JSON
DYNAMICRESPONSE_BASIC_REALM_NAME'API'The name of the Basic Auth realm
DYNAMICRESPONSE_DJANGO_USER_FIELDS('id', 'email', 'first_name', 'last_name')Defines which fields to include when serializing a Django auth User object

Tests

Run unit tests by running python setup.py test

Usage

See the included sample project for sample code using the framework to implement a simple blog application.

Import dynamicresponse in the views you want to use it:

from dynamicresponse.response import *

Return an instance of the appropriate response class depending on your view logic:

@login_required
def customer_list(request):
"""Lists all customers."""
customers = Customer.objects.all()
return SerializeOrRender('customers/list.html', { 'customers': customers })

The framework provides two response classes; SerializeOrRender and SerializeOrRedirect.

As the names imply, these response classes serialize the supplied context as JSON for API requests, and renders a template or redirects to a URL for normal requests. The first argument of both classes specifies the template to be rendered or the URL to redirect the user to.

To implement a REST API, you simply use SerializeOrRender in situations where you would typically use render_to_response, and SerializeOrRedirect in cases where you would otherwise return an HttpResponseRedirect instance.

For API requests, the second argument of the constructor is the context to be serialized for API requests. When rendering templates, it is often useful to pass additional context (such as forms and paginators) that is only useful when rendering the template, even though they are not relevant for API requests. The SerializeOrRender class supports additional context via a third argument, extra:

@login_required
def customer_list(request):
"""Lists all customers."""
customers = Customer.objects.all()
return SerializeOrRender('customers/list.html', { 'customers': customers }, extra={ 'somevalue': 'something' })

In this case, only customers are serialized in API responses, while both customers and somevalue is accessible when the template is rendered for normal requests.

Status codes

Content is normally returned as JSON with HTTP status code 200. If you want to return a different status code, set the status argument to one of the following values:

ConstantHTTP statusDescription
CR_OK200Default status
CR_INVALID_DATA400One or more forms are invalid
CR_NOT_FOUND404Not found (optional alternative to HttpResponseNotFound for consistency)
CR_CONFIRM405Confirm action with HTTP POST (use with SerializeOrRender with confirmation template)
CR_DELETED204The resource has been deleted

You can add custom status values by defining them as a tuple consisting of a string constant and the HTTP status code to return:

CR_REQUIRES_UPGRADE = ('REQUIRES_UPGRADE', 402)

Customizing serialization

By default, all fields not starting with an underscore (_) on the models will be serialized when returning a JSON response for API requests.

You can override this behavior by adding a serialize_fields method to your models, returning the fields to include:

class BlogPost(models.Model):
title = models.CharField('Title', max_length=255)
text = models.TextField('Text')
def serialize_fields(self):
"""Only these fields will be included in API responses."""
return [
'id',
'title',
'content',
]

This behavior also extends to nested objects. For instance, if the model above had included a foreign key to an author, only the fields defined in the author's serialize_fields method would have been included.

By default, callables are not included in the serialization. However, you can include names of callables in serialize_fields to explicitly include them in the serialization. This can for instance be useful to provide API users with useful dynamically computed information.

About

django-dynamicresponse is a lightweight framework for easily providing REST API's for web apps built with Django.

Resources

Stars

49 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

django-dynamicresponse

django-dynamicresponse is a lightweight framework for easily providing REST API's for Django applications.

The framework is intentionally very lightweight and minimalistic, and is designed to interoperate with existing Django code (such as form validation), without major changes.

In most cases, the only changes needed to add full REST API to an existing Django application is modifying the return statements in your views to return one of the response classes described below instead of a standard Django HttpResponse.

Features

  • Easy integration with existing code
  • Reuse same views and logic for both API and normal requests (no need for separate API handlers)
  • Decodes submitted JSON into request.POST, fully compatible with Django forms
  • Built-in support for HTTP Basic authentication

Installation

Install django-dynamicresponse:

pip install django-dynamicresponse

Alternatively, download the source code and manually add it to your PYTHONPATH.

Add the two middleware classes to MIDDLEWARE_CLASSES in your settings.py:

MIDDLEWARE_CLASSES = (
'dynamicresponse.middleware.api.APIMiddleware',
'dynamicresponse.middleware.dynamicformat.DynamicFormatMiddleware',
)

APIMiddleware detects incoming API requests based on HTTP headers and provides support for Basic authentication.

DynamicFormatMiddleware decodes incoming JSON content into request.POST, as well as rendering appropriate responses based on the returned value from your views.

Settings

These are the available configurable settings, along with their default values:

NameDefaultDescription
DYNAMICRESPONSE_JSON_FORM_ERRORSFalseOutputs form errors in JSON
DYNAMICRESPONSE_BASIC_REALM_NAME'API'The name of the Basic Auth realm
DYNAMICRESPONSE_DJANGO_USER_FIELDS('id', 'email', 'first_name', 'last_name')Defines which fields to include when serializing a Django auth User object

Tests

Run unit tests by running python setup.py test

Usage

See the included sample project for sample code using the framework to implement a simple blog application.

Import dynamicresponse in the views you want to use it:

from dynamicresponse.response import *

Return an instance of the appropriate response class depending on your view logic:

@login_required
def customer_list(request):
"""Lists all customers."""
customers = Customer.objects.all()
return SerializeOrRender('customers/list.html', { 'customers': customers })

The framework provides two response classes; SerializeOrRender and SerializeOrRedirect.

As the names imply, these response classes serialize the supplied context as JSON for API requests, and renders a template or redirects to a URL for normal requests. The first argument of both classes specifies the template to be rendered or the URL to redirect the user to.

To implement a REST API, you simply use SerializeOrRender in situations where you would typically use render_to_response, and SerializeOrRedirect in cases where you would otherwise return an HttpResponseRedirect instance.

For API requests, the second argument of the constructor is the context to be serialized for API requests. When rendering templates, it is often useful to pass additional context (such as forms and paginators) that is only useful when rendering the template, even though they are not relevant for API requests. The SerializeOrRender class supports additional context via a third argument, extra:

@login_required
def customer_list(request):
"""Lists all customers."""
customers = Customer.objects.all()
return SerializeOrRender('customers/list.html', { 'customers': customers }, extra={ 'somevalue': 'something' })

In this case, only customers are serialized in API responses, while both customers and somevalue is accessible when the template is rendered for normal requests.

Status codes

Content is normally returned as JSON with HTTP status code 200. If you want to return a different status code, set the status argument to one of the following values:

ConstantHTTP statusDescription
CR_OK200Default status
CR_INVALID_DATA400One or more forms are invalid
CR_NOT_FOUND404Not found (optional alternative to HttpResponseNotFound for consistency)
CR_CONFIRM405Confirm action with HTTP POST (use with SerializeOrRender with confirmation template)
CR_DELETED204The resource has been deleted

You can add custom status values by defining them as a tuple consisting of a string constant and the HTTP status code to return:

CR_REQUIRES_UPGRADE = ('REQUIRES_UPGRADE', 402)

Customizing serialization

By default, all fields not starting with an underscore (_) on the models will be serialized when returning a JSON response for API requests.

You can override this behavior by adding a serialize_fields method to your models, returning the fields to include:

class BlogPost(models.Model):
title = models.CharField('Title', max_length=255)
text = models.TextField('Text')
def serialize_fields(self):
"""Only these fields will be included in API responses."""
return [
'id',
'title',
'content',
]

This behavior also extends to nested objects. For instance, if the model above had included a foreign key to an author, only the fields defined in the author's serialize_fields method would have been included.

By default, callables are not included in the serialization. However, you can include names of callables in serialize_fields to explicitly include them in the serialization. This can for instance be useful to provide API users with useful dynamically computed information.

About

django-dynamicresponse is a lightweight framework for easily providing REST API's for web apps built with Django.

Resources

Stars

49 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

django-dynamicresponse

django-dynamicresponse is a lightweight framework for easily providing REST API's for Django applications.

The framework is intentionally very lightweight and minimalistic, and is designed to interoperate with existing Django code (such as form validation), without major changes.

In most cases, the only changes needed to add full REST API to an existing Django application is modifying the return statements in your views to return one of the response classes described below instead of a standard Django HttpResponse.

Features

  • Easy integration with existing code
  • Reuse same views and logic for both API and normal requests (no need for separate API handlers)
  • Decodes submitted JSON into request.POST, fully compatible with Django forms
  • Built-in support for HTTP Basic authentication

Installation

Install django-dynamicresponse:

pip install django-dynamicresponse

Alternatively, download the source code and manually add it to your PYTHONPATH.

Add the two middleware classes to MIDDLEWARE_CLASSES in your settings.py:

MIDDLEWARE_CLASSES = (
'dynamicresponse.middleware.api.APIMiddleware',
'dynamicresponse.middleware.dynamicformat.DynamicFormatMiddleware',
)

APIMiddleware detects incoming API requests based on HTTP headers and provides support for Basic authentication.

DynamicFormatMiddleware decodes incoming JSON content into request.POST, as well as rendering appropriate responses based on the returned value from your views.

Settings

These are the available configurable settings, along with their default values:

NameDefaultDescription
DYNAMICRESPONSE_JSON_FORM_ERRORSFalseOutputs form errors in JSON
DYNAMICRESPONSE_BASIC_REALM_NAME'API'The name of the Basic Auth realm
DYNAMICRESPONSE_DJANGO_USER_FIELDS('id', 'email', 'first_name', 'last_name')Defines which fields to include when serializing a Django auth User object

Tests

Run unit tests by running python setup.py test

Usage

See the included sample project for sample code using the framework to implement a simple blog application.

Import dynamicresponse in the views you want to use it:

from dynamicresponse.response import *

Return an instance of the appropriate response class depending on your view logic:

@login_required
def customer_list(request):
"""Lists all customers."""
customers = Customer.objects.all()
return SerializeOrRender('customers/list.html', { 'customers': customers })

The framework provides two response classes; SerializeOrRender and SerializeOrRedirect.

As the names imply, these response classes serialize the supplied context as JSON for API requests, and renders a template or redirects to a URL for normal requests. The first argument of both classes specifies the template to be rendered or the URL to redirect the user to.

To implement a REST API, you simply use SerializeOrRender in situations where you would typically use render_to_response, and SerializeOrRedirect in cases where you would otherwise return an HttpResponseRedirect instance.

For API requests, the second argument of the constructor is the context to be serialized for API requests. When rendering templates, it is often useful to pass additional context (such as forms and paginators) that is only useful when rendering the template, even though they are not relevant for API requests. The SerializeOrRender class supports additional context via a third argument, extra:

@login_required
def customer_list(request):
"""Lists all customers."""
customers = Customer.objects.all()
return SerializeOrRender('customers/list.html', { 'customers': customers }, extra={ 'somevalue': 'something' })

In this case, only customers are serialized in API responses, while both customers and somevalue is accessible when the template is rendered for normal requests.

Status codes

Content is normally returned as JSON with HTTP status code 200. If you want to return a different status code, set the status argument to one of the following values:

ConstantHTTP statusDescription
CR_OK200Default status
CR_INVALID_DATA400One or more forms are invalid
CR_NOT_FOUND404Not found (optional alternative to HttpResponseNotFound for consistency)
CR_CONFIRM405Confirm action with HTTP POST (use with SerializeOrRender with confirmation template)
CR_DELETED204The resource has been deleted

You can add custom status values by defining them as a tuple consisting of a string constant and the HTTP status code to return:

CR_REQUIRES_UPGRADE = ('REQUIRES_UPGRADE', 402)

Customizing serialization

By default, all fields not starting with an underscore (_) on the models will be serialized when returning a JSON response for API requests.

You can override this behavior by adding a serialize_fields method to your models, returning the fields to include:

class BlogPost(models.Model):
title = models.CharField('Title', max_length=255)
text = models.TextField('Text')
def serialize_fields(self):
"""Only these fields will be included in API responses."""
return [
'id',
'title',
'content',
]

This behavior also extends to nested objects. For instance, if the model above had included a foreign key to an author, only the fields defined in the author's serialize_fields method would have been included.

By default, callables are not included in the serialization. However, you can include names of callables in serialize_fields to explicitly include them in the serialization. This can for instance be useful to provide API users with useful dynamically computed information.

About

django-dynamicresponse is a lightweight framework for easily providing REST API's for web apps built with Django.

Resources

Stars

49 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

django-dynamicresponse

django-dynamicresponse is a lightweight framework for easily providing REST API's for Django applications.

The framework is intentionally very lightweight and minimalistic, and is designed to interoperate with existing Django code (such as form validation), without major changes.

In most cases, the only changes needed to add full REST API to an existing Django application is modifying the return statements in your views to return one of the response classes described below instead of a standard Django HttpResponse.

Features

  • Easy integration with existing code
  • Reuse same views and logic for both API and normal requests (no need for separate API handlers)
  • Decodes submitted JSON into request.POST, fully compatible with Django forms
  • Built-in support for HTTP Basic authentication

Installation

Install django-dynamicresponse:

pip install django-dynamicresponse

Alternatively, download the source code and manually add it to your PYTHONPATH.

Add the two middleware classes to MIDDLEWARE_CLASSES in your settings.py:

MIDDLEWARE_CLASSES = (
'dynamicresponse.middleware.api.APIMiddleware',
'dynamicresponse.middleware.dynamicformat.DynamicFormatMiddleware',
)

APIMiddleware detects incoming API requests based on HTTP headers and provides support for Basic authentication.

DynamicFormatMiddleware decodes incoming JSON content into request.POST, as well as rendering appropriate responses based on the returned value from your views.

Settings

These are the available configurable settings, along with their default values:

NameDefaultDescription
DYNAMICRESPONSE_JSON_FORM_ERRORSFalseOutputs form errors in JSON
DYNAMICRESPONSE_BASIC_REALM_NAME'API'The name of the Basic Auth realm
DYNAMICRESPONSE_DJANGO_USER_FIELDS('id', 'email', 'first_name', 'last_name')Defines which fields to include when serializing a Django auth User object

Tests

Run unit tests by running python setup.py test

Usage

See the included sample project for sample code using the framework to implement a simple blog application.

Import dynamicresponse in the views you want to use it:

from dynamicresponse.response import *

Return an instance of the appropriate response class depending on your view logic:

@login_required
def customer_list(request):
"""Lists all customers."""
customers = Customer.objects.all()
return SerializeOrRender('customers/list.html', { 'customers': customers })

The framework provides two response classes; SerializeOrRender and SerializeOrRedirect.

As the names imply, these response classes serialize the supplied context as JSON for API requests, and renders a template or redirects to a URL for normal requests. The first argument of both classes specifies the template to be rendered or the URL to redirect the user to.

To implement a REST API, you simply use SerializeOrRender in situations where you would typically use render_to_response, and SerializeOrRedirect in cases where you would otherwise return an HttpResponseRedirect instance.

For API requests, the second argument of the constructor is the context to be serialized for API requests. When rendering templates, it is often useful to pass additional context (such as forms and paginators) that is only useful when rendering the template, even though they are not relevant for API requests. The SerializeOrRender class supports additional context via a third argument, extra:

@login_required
def customer_list(request):
"""Lists all customers."""
customers = Customer.objects.all()
return SerializeOrRender('customers/list.html', { 'customers': customers }, extra={ 'somevalue': 'something' })

In this case, only customers are serialized in API responses, while both customers and somevalue is accessible when the template is rendered for normal requests.

Status codes

Content is normally returned as JSON with HTTP status code 200. If you want to return a different status code, set the status argument to one of the following values:

ConstantHTTP statusDescription
CR_OK200Default status
CR_INVALID_DATA400One or more forms are invalid
CR_NOT_FOUND404Not found (optional alternative to HttpResponseNotFound for consistency)
CR_CONFIRM405Confirm action with HTTP POST (use with SerializeOrRender with confirmation template)
CR_DELETED204The resource has been deleted

You can add custom status values by defining them as a tuple consisting of a string constant and the HTTP status code to return:

CR_REQUIRES_UPGRADE = ('REQUIRES_UPGRADE', 402)

Customizing serialization

By default, all fields not starting with an underscore (_) on the models will be serialized when returning a JSON response for API requests.

You can override this behavior by adding a serialize_fields method to your models, returning the fields to include:

class BlogPost(models.Model):
title = models.CharField('Title', max_length=255)
text = models.TextField('Text')
def serialize_fields(self):
"""Only these fields will be included in API responses."""
return [
'id',
'title',
'content',
]

This behavior also extends to nested objects. For instance, if the model above had included a foreign key to an author, only the fields defined in the author's serialize_fields method would have been included.

By default, callables are not included in the serialization. However, you can include names of callables in serialize_fields to explicitly include them in the serialization. This can for instance be useful to provide API users with useful dynamically computed information.

About

django-dynamicresponse is a lightweight framework for easily providing REST API's for web apps built with Django.

Resources

Stars

49 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

django-dynamicresponse

django-dynamicresponse is a lightweight framework for easily providing REST API's for Django applications.

The framework is intentionally very lightweight and minimalistic, and is designed to interoperate with existing Django code (such as form validation), without major changes.

In most cases, the only changes needed to add full REST API to an existing Django application is modifying the return statements in your views to return one of the response classes described below instead of a standard Django HttpResponse.

Features

  • Easy integration with existing code
  • Reuse same views and logic for both API and normal requests (no need for separate API handlers)
  • Decodes submitted JSON into request.POST, fully compatible with Django forms
  • Built-in support for HTTP Basic authentication

Installation

Install django-dynamicresponse:

pip install django-dynamicresponse

Alternatively, download the source code and manually add it to your PYTHONPATH.

Add the two middleware classes to MIDDLEWARE_CLASSES in your settings.py:

MIDDLEWARE_CLASSES = (
'dynamicresponse.middleware.api.APIMiddleware',
'dynamicresponse.middleware.dynamicformat.DynamicFormatMiddleware',
)

APIMiddleware detects incoming API requests based on HTTP headers and provides support for Basic authentication.

DynamicFormatMiddleware decodes incoming JSON content into request.POST, as well as rendering appropriate responses based on the returned value from your views.

Settings

These are the available configurable settings, along with their default values:

NameDefaultDescription
DYNAMICRESPONSE_JSON_FORM_ERRORSFalseOutputs form errors in JSON
DYNAMICRESPONSE_BASIC_REALM_NAME'API'The name of the Basic Auth realm
DYNAMICRESPONSE_DJANGO_USER_FIELDS('id', 'email', 'first_name', 'last_name')Defines which fields to include when serializing a Django auth User object

Tests

Run unit tests by running python setup.py test

Usage

See the included sample project for sample code using the framework to implement a simple blog application.

Import dynamicresponse in the views you want to use it:

from dynamicresponse.response import *

Return an instance of the appropriate response class depending on your view logic:

@login_required
def customer_list(request):
"""Lists all customers."""
customers = Customer.objects.all()
return SerializeOrRender('customers/list.html', { 'customers': customers })

The framework provides two response classes; SerializeOrRender and SerializeOrRedirect.

As the names imply, these response classes serialize the supplied context as JSON for API requests, and renders a template or redirects to a URL for normal requests. The first argument of both classes specifies the template to be rendered or the URL to redirect the user to.

To implement a REST API, you simply use SerializeOrRender in situations where you would typically use render_to_response, and SerializeOrRedirect in cases where you would otherwise return an HttpResponseRedirect instance.

For API requests, the second argument of the constructor is the context to be serialized for API requests. When rendering templates, it is often useful to pass additional context (such as forms and paginators) that is only useful when rendering the template, even though they are not relevant for API requests. The SerializeOrRender class supports additional context via a third argument, extra:

@login_required
def customer_list(request):
"""Lists all customers."""
customers = Customer.objects.all()
return SerializeOrRender('customers/list.html', { 'customers': customers }, extra={ 'somevalue': 'something' })

In this case, only customers are serialized in API responses, while both customers and somevalue is accessible when the template is rendered for normal requests.

Status codes

Content is normally returned as JSON with HTTP status code 200. If you want to return a different status code, set the status argument to one of the following values:

ConstantHTTP statusDescription
CR_OK200Default status
CR_INVALID_DATA400One or more forms are invalid
CR_NOT_FOUND404Not found (optional alternative to HttpResponseNotFound for consistency)
CR_CONFIRM405Confirm action with HTTP POST (use with SerializeOrRender with confirmation template)
CR_DELETED204The resource has been deleted

You can add custom status values by defining them as a tuple consisting of a string constant and the HTTP status code to return:

CR_REQUIRES_UPGRADE = ('REQUIRES_UPGRADE', 402)

Customizing serialization

By default, all fields not starting with an underscore (_) on the models will be serialized when returning a JSON response for API requests.

You can override this behavior by adding a serialize_fields method to your models, returning the fields to include:

class BlogPost(models.Model):
title = models.CharField('Title', max_length=255)
text = models.TextField('Text')
def serialize_fields(self):
"""Only these fields will be included in API responses."""
return [
'id',
'title',
'content',
]

This behavior also extends to nested objects. For instance, if the model above had included a foreign key to an author, only the fields defined in the author's serialize_fields method would have been included.

By default, callables are not included in the serialization. However, you can include names of callables in serialize_fields to explicitly include them in the serialization. This can for instance be useful to provide API users with useful dynamically computed information.

About

django-dynamicresponse is a lightweight framework for easily providing REST API's for web apps built with Django.

Resources

Stars

49 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages