Hello lru_cache.

This commit is contained in:
Julien Palard 2023-04-21 14:47:30 +02:00
parent 27b9221859
commit 5fb85fb674
Signed by: mdk
GPG Key ID: 0EFC1AC1006886F8
4 changed files with 24 additions and 28 deletions

View File

@ -1,6 +1,8 @@
from webtools import settings
from django import forms from django import forms
from django.forms import ModelForm, CharField from django.forms import CharField, ModelForm
from webtools import settings
from .models import Paste from .models import Paste

View File

@ -1,10 +1,12 @@
from django.db import models
from django.core.validators import MaxLengthValidator
from django.utils import timezone
from datetime import datetime, timedelta from datetime import datetime, timedelta
from webtools import settings
from django.utils.translation import gettext_lazy as _
import shortuuid import shortuuid
from django.core.validators import MaxLengthValidator
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from webtools import settings
class Paste(models.Model): class Paste(models.Model):

View File

@ -1,9 +1,9 @@
from django.urls import path from django.urls import path
from django.views.static import serve from django.views.static import serve
from paste import views from paste import views
from webtools import settings from webtools import settings
urlpatterns = [ urlpatterns = [
path("", views.index, name="index"), path("", views.index, name="index"),
path("static/<path>", serve, {"document_root": settings.STATIC_ROOT}), path("static/<path>", serve, {"document_root": settings.STATIC_ROOT}),

View File

@ -1,19 +1,18 @@
import json import json
from pathlib import Path from functools import lru_cache
import pygments
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render from django.shortcuts import get_object_or_404, render
from django.template import RequestContext, loader from django.template import RequestContext, loader
from django.urls import reverse from django.urls import reverse
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
import pygments
from pygments.formatters import HtmlFormatter from pygments.formatters import HtmlFormatter
from pygments.lexers import get_lexer_by_name from pygments.lexers import get_lexer_by_name
from webtools import settings
from paste.forms import PasteForm from paste.forms import PasteForm
from paste.models import Paste from paste.models import Paste
from webtools import settings
@csrf_exempt @csrf_exempt
@ -51,26 +50,19 @@ def show(request, slug):
paste.incr_viewcount() paste.incr_viewcount()
if "html" in request.headers["accept"]: if "html" in request.headers["accept"]:
render_method = render_pygments return HttpResponse(pygmentize(paste.filename, paste.content))
else: else:
render_method = render_raw return HttpResponse(paste.content, content_type="text/plain")
return render_method(request, paste, {"slug": slug})
def render_pygments(request, paste, data): @lru_cache(1024)
"""Renders Pygments template.""" def pygmentize(filename, filecontents):
try: try:
lexer = get_lexer_by_name(Path(paste.filename).suffix.strip(".")) lexer = get_lexer_by_name(filename.split(".")[-1])
except pygments.util.ClassNotFound: except pygments.util.ClassNotFound:
lexer = get_lexer_by_name(settings.PASTE["default_language"]) lexer = get_lexer_by_name(settings.PASTE["default_language"])
formatter = HtmlFormatter(style="emacs") formatter = HtmlFormatter(style="emacs")
data["paste"] = paste data = {}
data["filename"] = paste.filename data["filename"] = filename
data["highlighted"] = pygments.highlight(paste.content, lexer, formatter) data["highlighted"] = pygments.highlight(filecontents, lexer, formatter)
rendered = loader.render_to_string("paste/show-pygments.html", data, request) return loader.render_to_string("paste/show-pygments.html", data)
return HttpResponse(rendered)
def render_raw(request, paste, data):
"""Renders RAW content."""
return HttpResponse(paste.content, content_type="text/plain")