Obtaining content from Git

86 views
Skip to first unread message

martin f krafft

unread,
Nov 21, 2014, 6:42:12 PM11/21/14
to django users list
Hello,

we have a Django project with a few pages that come from Git.
Currently, Apache rewrite rules serve those files statically (and
they make use of the same template/CSS as Django does, so the user
does not actually notice), and it's a massive hack and pain to keep
up-to-date.

Hence I was thinking: how much trouble would it be to have Django
reach into Git rather than its database and obtain data there to be
filled into template slots? Ideally, there'd be the possibility of
running a filter (e.g. reStructuredText) between Git and the
template rendering.

I've seen http://luispedro.org/software/git-cms, but that does way
more than just sourcing from Git. And it's not immediately obvious
to me how it even does the Git interaction.

What I envision is a storage layer (with optional caching) that
either fetches from the filesystem (with a Git checkout, using mtime
for cache expiration), or directly from a local Git repo (using
either commit or blob hash for cache expiration).

Does anyone know of such a module? Would it be hard to write? Where
would one start?

Thanks,

--
@martinkrafft | http://madduck.net/ | http://two.sentenc.es/

mulutlitithtrhreeaadededd s siigngnatatuurere

spamtraps: madduc...@madduck.net
digital_signature_gpg.asc

Aaron C. de Bruyn

unread,
Nov 21, 2014, 9:40:53 PM11/21/14
to django...@googlegroups.com
I'm not aware of any such module, but there are a few python 'git'
modules for reading/writing, etc...

As for how much trouble it would be, that all depends on how familiar
you are with git, python, Django, and the template system.

One way you might be able to achieve what you want is to create your
own template tag. (The documentation is here:
https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-tags)

You could pass a few parameters to your tag--I'm not sure what you're
looking for, but maybe:

{% gitfile "myfolder/myfile.txt" "d4ea4eea799" %}

And your tag could load data from "myfolder/myfile.txt" at revision
"d4ea4eea799".

There are a few exampled in the Django code itself
(https://github.com/django/django/tree/master/django/templatetags) as
well as plenty of samples on the internet for writing your own
template tag.

-A
> --
> You received this message because you are subscribed to the Google Groups "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.
> To post to this group, send email to django...@googlegroups.com.
> Visit this group at http://groups.google.com/group/django-users.
> To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/20141121222930.GA15206%40fishbowl.rw.madduck.net.
> For more options, visit https://groups.google.com/d/optout.

martin f krafft

unread,
Nov 22, 2014, 4:29:29 PM11/22/14
to django users list
Hello,

we have a Django project with a few pages that come from Git.
Currently, Apache rewrite rules serve those files statically (and
they make use of the same template/CSS as Django does, so the user
does not actually notice), and it's a massive hack and pain to keep
up-to-date.

Hence I was thinking: how much trouble would it be to have Django
reach into Git rather than its database and obtain data there to be
filled into template slots? Ideally, there'd be the possibility of
running a filter (e.g. reStructuredText) between Git and the
template rendering.

I've seen http://luispedro.org/software/git-cms, but that does way
more than just sourcing from Git. And it's not immediately obvious
to me how it even does the Git interaction.

What I envision is a storage layer (with optional caching) that
either fetches from the filesystem (with a Git checkout, using mtime
for cache expiration), or directly from a local Git repo (using
either commit or blob hash for cache expiration).

Does anyone know of such a module? Would it be hard to write? Where
would one start?

Thanks,

--
@martinkrafft | http://madduck.net/ | http://two.sentenc.es/

"imagine if every thursday your shoes exploded if you
tied them the usual way. this happens to us all the time
with computers, and nobody thinks of complaining."
-- jeff raskin

spamtraps: madduc...@madduck.net
digital_signature_gpg.asc

Russell Keith-Magee

unread,
Nov 23, 2014, 6:44:20 PM11/23/14
to Django Users
On Sun, Nov 23, 2014 at 5:28 AM, martin f krafft <mad...@madduck.net> wrote:
Hello,

we have a Django project with a few pages that come from Git.
Currently, Apache rewrite rules serve those files statically (and
they make use of the same template/CSS as Django does, so the user
does not actually notice), and it's a massive hack and pain to keep
up-to-date.

Hence I was thinking: how much trouble would it be to have Django
reach into Git rather than its database and obtain data there to be
filled into template slots? Ideally, there'd be the possibility of
running a filter (e.g. reStructuredText) between Git and the
template rendering.

I've seen http://luispedro.org/software/git-cms, but that does way
more than just sourcing from Git. And it's not immediately obvious
to me how it even does the Git interaction.

What I envision is a storage layer (with optional caching) that
either fetches from the filesystem (with a Git checkout, using mtime
for cache expiration), or directly from a local Git repo (using
either commit or blob hash for cache expiration).

Does anyone know of such a module? Would it be hard to write? Where
would one start?

The problem is that there isn't one. There's several :-)

I'm aware of at least 3:


These are all Python wrappers around the Git API - and, in the case of dulwich, a full re-implementation of git in Python. Using these APIs, you should be able to retrieve an file with an arbitrary hash, the same as you would at the command line.

I haven't used any of them myself, so I can't comment on which one is best/most stable/most reliable/fastest, but:

 * Yes, they exist

 * Yes, you could use these modules to retrieve information from the git checkout as part of a view

 * Yes, that data could then be passed to a template, either directly, or after post-processing with a filter of some kind.

Yours,
Russ Magee %-)

martin f krafft

unread,
Nov 24, 2014, 12:45:51 AM11/24/14
to Django Users
also sprach Russell Keith-Magee <rus...@keith-magee.com> [2014-11-24 00:42 +0100]:
> The problem is that there isn't one. There's several :-)
>
> I'm aware of at least 3:
>
> https://pypi.python.org/pypi/GitPython/0.3.2.1
> https://pypi.python.org/pypi/pygit2
> https://pypi.python.org/pypi/dulwich

I am aware of those and I was wondering more about the glue on the
Django-side of things, i.e. how the storage plugin/layer would work.

I am pretty inexperienced with Django, hence I find it hard to even
figure out where the sensible place to do this would be.
"there are two major products that come out of berkeley: lsd and unix.
we don't believe this to be a coincidence."
-- jeremy s. anderson

spamtraps: madduc...@madduck.net
digital_signature_gpg.asc

Russell Keith-Magee

unread,
Nov 24, 2014, 1:17:31 AM11/24/14
to Django Users
On Mon, Nov 24, 2014 at 1:45 PM, martin f krafft <mad...@madduck.net> wrote:
also sprach Russell Keith-Magee <rus...@keith-magee.com> [2014-11-24 00:42 +0100]:
> The problem is that there isn't one. There's several :-)
>
> I'm aware of at least 3:
>
> https://pypi.python.org/pypi/GitPython/0.3.2.1
> https://pypi.python.org/pypi/pygit2
> https://pypi.python.org/pypi/dulwich

I am aware of those and I was wondering more about the glue on the
Django-side of things, i.e. how the storage plugin/layer would work.

I am pretty inexperienced with Django, hence I find it hard to even
figure out where the sensible place to do this would be.

The right place is in the view.

At the simplest level, a view is just a function that converts a request into a response. "Normal" Django template rendering (i.e., return render(request, "mytemplate.html", {'object': obj}) ) hides a lot of detail - but all it's really doing is opening a file on disk (from one of a couple of a known locations - the template directories), parsing that template, rendering it with a context, and returning it to the user.

A simple "hello world" view will develop "obj" by doing database queries - but the information can come from any other data source that is relevant. You might hit a non-relational store (such as Redis), or a search engine (like ElasticSearch), or do some sort of calculation based on the GET/POST arguments provided. In your case, you'll be taking the GET/POST values, plus the URL parameters, and using them to identify a "resource" in your Git tree; your git calls will extract that resource; and then you can either return that resource literally as your response (with an appropriate content type), or pass the resource to a template to be rendered.

Thinking about the storage layer is going deeper than you need to go. The storage layer is an abstraction to enable reusable apps. If I write a "user profile" app that needs to store an avatar, then I don't care where that avatar comes from, as long as it's available. It could be on a local filesystem; it could be on a cloud file store (like S3). The storage API lets me do that. 

The storage API isn't there to abstract all possible concepts of storage that might exist, and just because you'll be accessing a notional file system, doesn't mean that access needs to be done through the storage API - it's fine to just open the file.

While you probably *could* write a storage plugin that would read a git repository, that's not really what the storage API is for. 

If you're just looking to read the *current* value in a git repository, then just use normal filesystem storage over a normal git checkout. If you want to do "interesting" things like retrieve a specific file version, you're not going to be able to use the storage API, because most raw filesystems don't have a concept of versioning. 

Yours,
Russ Magee %-)
 

martin f krafft

unread,
Nov 24, 2014, 4:09:02 AM11/24/14
to django...@googlegroups.com
also sprach Russell Keith-Magee <rus...@keith-magee.com> [2014-11-24 07:16 +0100]:
> The right place is in the view.
[…]
> If you want to do "interesting" things like retrieve a specific
> file version, you're not going to be able to use the storage API,
> because most raw

Interesting perspective you have there, which I can follow very
well. Thanks!

But let me dig a bit further, nevertheless:

> The storage layer is an abstraction to enable reusable apps. If
> I write a "user profile" app that needs to store an avatar, then
> I don't care where that avatar comes from, as long as it's
> available. It could be on a local filesystem; it could be on
> a cloud file store (like S3). The storage API lets me do that.

It could come from Git! After all, Git is really a database by
itself, just like the filesystem could be viewed as a database. So
somewhere in my idealist brain there's this theory that I could just
add a Git-storage-plugin to the storage layer and that would cause
content to be fetched from Git auto-magically if the
request-for-data by the view (not the HTTP request) matches certain
criteria and those data are available in Git. If not, then the
lookup goes to the next storage plugin.

So my view might call some sort of lookup() function, e.g.

lookup_description(event_id)

which just returns a string. Ordinarily, this string comes from
pgsql at the moment. What I'd like to see is a way to override this
function so that instead the data are fetched from
git.example.org/myrepo.git, branch=live, file=events/$event_id

Obviously, I could just as well call the Git-specific stuff straight
from the view, but that would inevitably tie the view to Git. Maybe
this is what I want, I am just trying to explain how I approached
this and what led me to ask the question the way I did.

> If you're just looking to read the *current* value in a git
> repository, then just use normal filesystem storage over a normal
> git checkout.

Yeah, this might well be the best option, also in terms of
performance, unless I want to keep track of blob hashes to avoid
doing the whole branch→tree→blob lookup every time, which the
filesystem "caches" for me.

Do you know of a simple example that fetches data from the
filesystem? I am being lazy here as I am sure there's plenty, so
feel free to RTFM me! ;) However, maybe you know a very good example
that makes everything so clear and then I'd really appreciate this
over wading through the various means. I know Django has provisions
for serving static files, but somehow it seems like that's not what
I want… (since the files are not actually static and a given path
could return different data on subsequent calls)



Furthermore, I'd actually like to post-process the data. The Git
repo would contain reStructuredText files and I'd like to render
them before filling the result into template slots.

This makes me think that there ought to be a cache involved at this
level. Sure, I could make a simple expiration-based cache, but I'd
really rather make the cache depend on the mtime of the underlying
source file on the filesystem (but include the post-processing step
in between).

Have you seen something like this done? Is this also still best done
in a view?

Thanks a lot for your patience and helpful replies!
review of a chemistry paper:
"paper should be greatly reduced or completely oxidized."
-- frank vastola

spamtraps: madduc...@madduck.net
digital_signature_gpg.asc

Tim Chase

unread,
Nov 24, 2014, 5:19:01 AM11/24/14
to django...@googlegroups.com
On 2014-11-24 10:06, martin f krafft wrote:
> It could come from Git! After all, Git is really a database by
> itself, just like the filesystem could be viewed as a database.
[snip]
> Furthermore, I'd actually like to post-process the data. The Git
> repo would contain reStructuredText files and I'd like to render
> them before filling the result into template slots.

You'd still have to sort out how to know which blob you want to
return/render. If you have the hash-id of it, you can do a direct
lookup. Throwing together some pseudo-code, your urls.py might look
something like

urlpatterns = patterns('',
url(r'^blob/([0-9a-f]{40})/$', 'myapp.views.render_blob', ...),
)

and then in myapp/views.py you'd have something like

from django.shortcuts import render
import some_git_lib
import your_markdown_lib

def render_blob(request, sha):
try:
blob = some_git_lib.fetch_blob(sha)
except some_git_lib.SomeException:
raise # do some actual error handling/reporting here
else:
rendered_markdown = your_markdown_lib.htmlize(blob)
return render(request, "my_template.html", {"data": blob})

Only you know how the sha1 of the blob is determined, but the rest
should give you a pretty straight-forward implementation. In theory,
you could also set the cache control headers in the response so that
they're ludicrously far in the future (assuming you don't plan to
change your my_template.html) because the blob shouldn't ever change
without having a different SHA1.

-tkc



Russell Keith-Magee

unread,
Nov 24, 2014, 5:38:46 AM11/24/14
to Django Users
Perhaps I wasn't clear. Of course an avatar could come from a git store. My point is that it's not a natural mapping. A file system is a mapping between a path name and a binary blob. Git has an additional layer - the path name, *plus* a historical version (referenced either by a hash, or a date). And you can't arbitrarily write to any point in a Git tree. Ok... you can if you're willing to have orphan nodes, but if you're thinking about version control in the traditional sense, a git repository can only be written to the "end" of history, but read from any point in it's history.

You might be able to write a mapping to Storage that did some sort of naming trick (e.g., split off a colon at the end of a filename for read, so you could request "/my/file.txt:deadbeef" to request the "deadbeaf" hash of /my/file.txt") - but my point is that the storage API doesn't contain a *natural* endpoint for version information. 

And, even if you did this, what you're going to get is a view of your Git repository that tries *really* hard to make it look like just a normal file system. All the interesting features will, by necessity of the interface, be buried. If you actually want to do anything interesting based on the fact that you're using a git store under the hood, you're better served working closer to the metal.

> If you're just looking to read the *current* value in a git
> repository, then just use normal filesystem storage over a normal
> git checkout.

Yeah, this might well be the best option, also in terms of
performance, unless I want to keep track of blob hashes to avoid
doing the whole branch→tree→blob lookup every time, which the
filesystem "caches" for me.

Do you know of a simple example that fetches data from the
filesystem? I am being lazy here as I am sure there's plenty, so
feel free to RTFM me! ;) However, maybe you know a very good example
that makes everything so clear and then I'd really appreciate this
over wading through the various means. I know Django has provisions
for serving static files, but somehow it seems like that's not what
I want… (since the files are not actually static and a given path
could return different data on subsequent calls)

A simple example that fetches data from the filesystem? Sure:

def myview(request):
    with open('filename.txt') as datafile:
        data = datafile.read()
    return render(request, 'my template.html', {'data': data})

You're possibly getting lost by thinking that this is a "Django" thing - it isn't. Basic Python is always an option. 

Furthermore, I'd actually like to post-process the data. The Git
repo would contain reStructuredText files and I'd like to render
them before filling the result into template slots.

This makes me think that there ought to be a cache involved at this
level. Sure, I could make a simple expiration-based cache, but I'd
really rather make the cache depend on the mtime of the underlying
source file on the filesystem (but include the post-processing step
in between)

Sure - so you can cache the result of the ReST rendering call. The result of any function call can be passed to Django's cache primitives, or the {% cache %} template tag can be used to do this at the template level. However, if you want to do this based on mtime - there are a bunch of things you can do with NginX and/or varnish to do *response* level caching; if you exploit the HTTP Last-Modified header and/or Etags:


you can get your browser and webserver to do the caching for you.
 
Have you seen something like this done? Is this also still best done
in a view?
 
Well... yes, I've seen this done before. It's called GitHub :-)
 
Yours
Russ Magee %-)

martin f krafft

unread,
Nov 24, 2014, 5:50:31 AM11/24/14
to django...@googlegroups.com
also sprach Tim Chase <django...@tim.thechases.com> [2014-11-24 11:19 +0100]:
> urlpatterns = patterns('',
> url(r'^blob/([0-9a-f]{40})/$', 'myapp.views.render_blob', ...),
> )

… this is straight-forward, thanks. I'd probably try not to expose
the SHAs to the user but request from the Git library a blob
identified by a path such as /path/to/file which the Git
library should then map to the blob, given a treeish to use as
a base (e.g. 'master', this could come from config).

> In theory, you could also set the cache control headers in the
> response so that they're ludicrously far in the future (assuming
> you don't plan to change your my_template.html) because the blob
> shouldn't ever change without having a different SHA1.

Two problems I see with this:

1. If the SHA is not exposed, then a request path (see above) may
well return different content on subsequent calls, so
expiration-based caching isn't ideal;

2. aren't the cache-control headers for the caches downstream?
Wouldn't this mean that if 1,000 clients requested a page, the
reStructuredText processor would have to do the same work 1,000
times? I'd love to cache the result and serve that while the
source file's pre-processing mtime hasn't changed.
"i like wagner's music better than anybody's. it is so loud that one
can talk the whole time without other people hearing what one says."
-- oscar wilde

spamtraps: madduc...@madduck.net
digital_signature_gpg.asc

martin f krafft

unread,
Nov 24, 2014, 6:43:42 AM11/24/14
to django...@googlegroups.com
also sprach Russell Keith-Magee <rus...@keith-magee.com> [2014-11-24 11:38 +0100]:
> Perhaps I wasn't clear.

No, you were. I am just pushing back a little bit because I come
from another angle and I greatly appreciate your explanations in
helping me understand the Django way of thinking. So in the hope
that you now don't feel exploited… ;)

> You might be able to write a mapping to Storage that did some sort
> of naming trick (e.g., split off a colon at the end of a filename
> for read, so you could request "/my/file.txt:deadbeef" to request
> the "deadbeaf" hash of /my/file.txt") - but my point is that the
> storage API doesn't contain a *natural* endpoint for version
> information.

Arguably, the ref/hash/date could come from the config, not from the
file, and suddenly there'd be a 1:1 mapping between a filesystem
store and a storage that uses Git directly.

> And, even if you did this, what you're going to get is a view of
> your Git repository that tries *really* hard to make it look like
> just a normal file system.

Yeah, this is an excellent point, especially since I'd probably not
allow pushes to that Git repository but instead set up some sort of
polling or regular interval pulling. Then I might just as well use
a filesystem.

> def myview(request):
> with open('filename.txt') as datafile:
> data = datafile.read()
> return render(request, 'my template.html', {'data': data})
>
> You're possibly getting lost by thinking that this is a "Django" thing - it
> isn't. Basic Python is always an option.

Yeah, but I would like to assume that this has been wrapped for
Django at least one "canonical" time, with all error handling done
and proper cache integration taken care of.

Because to just start off with a myview() view like you suggest
above is quickly going to become a full-time project, if you know
what I mean. ;)

> > Have you seen something like this done? Is this also still best
> > done in a view?
>
> Well... yes, I've seen this done before. It's called GitHub :-)

Hehe, that was funny.

But seriously: forget about all of the Git stuff, let's just look at
the filesystem… at least in my universe, I'd like to assume that the
idea of reading marked-up data from disk, processing it, caching it
and then making the data available to templates is such an intuitive
and standard thing to do that it could even be in Django core — if
not there, then there ought to be an existing plugin for this.

Thanks for your help thus far!
don't hate yourself in the morning -- sleep till noon.

spamtraps: madduc...@madduck.net
digital_signature_gpg.asc

Tim Chase

unread,
Nov 24, 2014, 11:09:42 AM11/24/14
to django...@googlegroups.com, mad...@madduck.net
On 2014-11-24 11:49, martin f krafft wrote:
> also sprach Tim Chase <django...@tim.thechases.com> [2014-11-24
> 11:19 +0100]:
> > urlpatterns = patterns('',
> > url(r'^blob/([0-9a-f]{40})/$',
> > 'myapp.views.render_blob', ...), )
>
> … this is straight-forward, thanks. I'd probably try not to expose
> the SHAs to the user but request from the Git library a blob
> identified by a path such as /path/to/file which the Git
> library should then map to the blob, given a treeish to use as
> a base (e.g. 'master', this could come from config).

Django certainly gives you the flexibility to do both/either. You
can even do things like

url(r'branch/(?P<branch>[^/]*)(?P<filename>.*)', 'myapp.views.render_branch_file', ...)

and then in your views.py

def render_branch_file(request, branch, file_name):
data = some_git_lib.get_file_from_branch(branch, file_name)
...

You might need to tighten up those regular expressions in the urls.py
a bit, or sanitize them in the view to ensure that they don't allow
access to files outside the git tree (you might also want to prevent
access to the .git subdirectory)

> > In theory, you could also set the cache control headers in the
> > response so that they're ludicrously far in the future (assuming
> > you don't plan to change your my_template.html) because the blob
> > shouldn't ever change without having a different SHA1.
>
> Two problems I see with this:
>
> 1. If the SHA is not exposed, then a request path (see above) may
> well return different content on subsequent calls, so
> expiration-based caching isn't ideal;

You can use the resulting internal sha1 as the "etag" header which
would cache at the object level rather than at the URL level.

> 2. aren't the cache-control headers for the caches downstream?
> Wouldn't this mean that if 1,000 clients requested a page, the
> reStructuredText processor would have to do the same work 1,000
> times? I'd love to cache the result and serve that while the
> source file's pre-processing mtime hasn't changed.

yes-ish. If you have a caching proxy such as Varnish in front of your
Django server, it can cache the pages coming out and then serve them
to all requesting clients. I haven't dug into how that interacts
with "etag" vs. other cache-control headers, but that's where I'd
start researching. Or just set the other cache-control headers.

-tkc








Message has been deleted

reduxionist

unread,
Nov 24, 2014, 2:58:35 PM11/24/14
to django...@googlegroups.com
Arg, Google Groups' mobile interface sucks for posting rather than reading. As I was trying to say:

On Tuesday, November 25, 2014 2:43:55 AM UTC+7, reduxionist wrote:
>Hence I was thinking: how much trouble would it be to have Django
>reach into Git rather than its database and obtain data there to be
>filled into template slots? Ideally, there'd be the possibility of
>running a filter (e.g. reStructuredText) between Git and the
>template rendering.

>What I envision is a storage layer (with optional caching) that
>either fetches from the filesystem (with a Git checkout, using mtime
>for cache expiration), or directly from a local Git repo (using
>either commit or blob hash for cache expiration).

>Does anyone know of such a module?
 
Yes:
(before you fork to github anew, consider updating this existing, but out of date, github mirror: https://github.com/9h37/django-gitstorage)
 
>Would it be hard to write? Where would one start?

Here's a couple of example projects that do similar things.

A git-backed wiki:

A mercurial based latex hosting site:
("This is a Django Project providing a WebTeX service. The way this works is totally ripped from BitBucket: Users have HG Repos, push their Documents into it, and can get a compiled version and other cool stuff over the net.")

Russell Keith-Magee

unread,
Nov 24, 2014, 7:16:49 PM11/24/14
to Django Users
On Mon, Nov 24, 2014 at 7:43 PM, martin f krafft <mad...@madduck.net> wrote:
also sprach Russell Keith-Magee <rus...@keith-magee.com> [2014-11-24 11:38 +0100]:
> Perhaps I wasn't clear.

No, you were. I am just pushing back a little bit because I come
from another angle and I greatly appreciate your explanations in
helping me understand the Django way of thinking. So in the hope
that you now don't feel exploited… ;)

> You might be able to write a mapping to Storage that did some sort
> of naming trick (e.g., split off a colon at the end of a filename
> for read, so you could request "/my/file.txt:deadbeef" to request
> the "deadbeaf" hash of /my/file.txt") - but my point is that the
> storage API doesn't contain a *natural* endpoint for version
> information.

Arguably, the ref/hash/date could come from the config, not from the
file, and suddenly there'd be a 1:1 mapping between a filesystem
store and a storage that uses Git directly.


Sure - that could work too. Although I'd question why you'd do this, rather than just checking out the relevant hash onto the filesystem, and doing a direct filesystem read.

> And, even if you did this, what you're going to get is a view of
> your Git repository that tries *really* hard to make it look like
> just a normal file system.

Yeah, this is an excellent point, especially since I'd probably not
allow pushes to that Git repository but instead set up some sort of
polling or regular interval pulling. Then I might just as well use
a filesystem.

> def myview(request):
>     with open('filename.txt') as datafile:
>         data = datafile.read()
>     return render(request, 'my template.html', {'data': data})
>
> You're possibly getting lost by thinking that this is a "Django" thing - it
> isn't. Basic Python is always an option.

Yeah, but I would like to assume that this has been wrapped for
Django at least one "canonical" time, with all error handling done
and proper cache integration taken care of.

Because to just start off with a myview() view like you suggest
above is quickly going to become a full-time project, if you know
what I mean. ;)

Unless I'm missing some important detail, I don't see why. It's a fairly simple caching layer, and a fairly simple rendering layer. The only complexities that I can see are the ones related to accessing the Git repository - and that's the bit that isn't part of a "common" use case.
 
> > Have you seen something like this done? Is this also still best
> > done in a view?
>
> Well... yes, I've seen this done before. It's called GitHub :-)

Hehe, that was funny.

But seriously: forget about all of the Git stuff, let's just look at
the filesystem… at least in my universe, I'd like to assume that the
idea of reading marked-up data from disk, processing it, caching it
and then making the data available to templates is such an intuitive
and standard thing to do that it could even be in Django core — if
not there, then there ought to be an existing plugin for this.
 
Again - the reason that this isn't in Django is because it's not really Django's bailiwick. Response-level caching is something that should be handled at the web server level, and web servers have various ways to handle this. And if you're going to be even more ruthless about it, I'd be questioning why you've got a live Django server in the loop at all - if it's static files, "post processed", then why not pre-render the Github files to a "rendered" form (possibly in response to a commit trigger), and simply serve the pre-rendered files as static content.

Yours,
Russ Magee %-) 

martin f krafft

unread,
Nov 25, 2014, 12:41:39 AM11/25/14
to Django Users
also sprach Russell Keith-Magee <rus...@keith-magee.com> [2014-11-25 01:16 +0100]:
> Sure - that could work too. Although I'd question why you'd do
> this, rather than just checking out the relevant hash onto the
> filesystem, and doing a direct filesystem read.

Yeah, and I think you have me 99.5% convinced that I want
a filesystem backend.

> And if you're going to be even more ruthless about it, I'd be
> questioning why you've got a live Django server in the loop at all
> - if it's static files, "post processed", then why not pre-render
> the Github files to a "rendered" form (possibly in response to
> a commit trigger), and simply serve the pre-rendered files as
> static content.

Because the static content is used inside dynamic apps, and certain
parts of the website would be offered instead by apps and not static
files at all. As I said in my initial e-mail, we currently have
a Django app with Apache-level overrides of certain static pages
that are trying hard to look just like and integrate well with the
output Django renders and this is ugly.
normaliser unix c'est comme pasteuriser le camembert.

spamtraps: madduc...@madduck.net
digital_signature_gpg.asc
Reply all
Reply to author
Forward
0 new messages