Hi Jure, My point was mostly about hieracrhy, not the exact format. That said on a technical level it is true that the same can achieved via python -- after all this is what settings.py is currently. But the hard truth is that many people prefer a established configuration file format (for some definition of established). Having executable files as config files can also be dangerous. Assume a software that reads `env.py` from `[CWD, ~/.config/app, /etc/app]`. Now if someone manages to convince you to run the software in a directory that they preconfigured with an `env.py` you will execute the code they want you to execute. This is part of the reason why stuff like `direnv` and others explicitly require you to allow a directory before setting env variables from `.envrc` for you (the most common offender obviously being someone cloning a git repo and in the case of direnv simply stepping into the directory executes code).
How many of the standard python tooling ala pip, flake8, black, pytest, tox, isort allow you to have a python file as config file? At some point not supporting one of the more common config file format (.ini,.yaml,.toml) feels like swimming against the current without any real benefit. So yes, a python file would suffice but I guess that battle is lost already. Cheers, Florian On Wednesday, October 26, 2022 at 10:26:55 AM UTC+2 jure.er...@gmail.com wrote: > IMHO, adding YAML support would introduce a dependency that's not needed: > why not just use Python, instead of ini/yaml/toml? > > Projects could have a (.gitignore) env.py that settings.py imports and > then sets the appropriate variables from it. You can use straight > assignment, e.g. > > LANGUAGE_CODE = env.LANGUAGE_CODE > > or a getattr for optional settings: > > LANGUAGE_CODE = getattr(env, 'LANGUAGE_CODE', 'en-gb') > > No dependencies at all, not even internal python ones. > > But maybe I'm just being ignorant: there must be good reasons if core > python accepted toml. In that case, I hope to be enlightened (no sarcasm > here). > > LP, > Jure > > On 26. 10. 22 09:30, Florian Apolloner wrote: > > Hi Pete, > > this does look interesting. And I agree that this is something that would > be nice to have in core in one form or another. That said I think we have > to do it iteratively (ie in smaller parts) and evaluate along the way. > > Since you asked for feedback, I'll tell you what I'd do differently (and > this is also a sign that production environment vary widely). > > * As soon as health checks check something aside from simply returning a > 200 status code I'd want to be able to limit access to them > * I like my dev env to be as close as possible to production so I usually > also use whitenoise in dev. I had to many times where dev worked and > whitenoise in prod failed then :D > * I do hate `DJANGO_ENV` but I guess there is no way around it. Currently > my projects often piggy-back on DEBUG but that can be rather hard from time > to time > * I prefer settings in settings files (ini/yaml/toml) as opposed to env > variables that leak down the whole process-tree. django-environ does > support this; that said there are other options like dynaconf which also > support hashicorp vault which is a massive plus imo. Just being able to > utilize vault for free from every django application out there would be > stellar. > > Another thing about settings, and this is something I really like in > spring-boot is their relaxed binding for configuration variables. You can > look at > https://github.com/spring-projects/spring-boot/wiki/Relaxed-Binding-2.0 > for an example. They describe there how hierarchical variables are handled > and translated between yaml and env variables. Of course this binding is > not exactly bidirectional always (I think) but it allows for a few nice > things. First off you can start with a config file in yaml (one might > dislike yaml but I find it easier to read than say a .env file with 100 > settings): > > ``` > db: > host: myhost > port: 1234 > > caches: > default: > type: memory > second: > type: redis > ``` > > which would translate to the following env variables: > ``` > DB_HOST: myhost > DB_PORT: 1234 > CACHES_DEFAULT_TYPE: memory > CACHES_SECOND_TYPE: redis > ``` > > This is imo really a powerful concept and allows for so much nicer and > easier definitions. > > Cheers, > Florian > > On Friday, October 21, 2022 at 9:56:50 PM UTC+2 pe...@lincolnloop.com > wrote: > >> I put together a first stab at this at >> https://github.com/lincolnloop/django-production. Feedback is >> appreciated! >> >> On Tue, Aug 23, 2022 at 1:34 PM pe...@lincolnloop.com < >> pe...@lincolnloop.com> wrote: >> >>> I hadn't seen django-simple-deploy. At first glance, it looks >>> interesting, but more platform-specific than what I was thinking. >>> >>> I'll play around with creating a third-party app that encapsulates some >>> of these thoughts and see where I end up. >>> >>> Thanks for your time and feedback! >>> >>> On Tuesday, August 23, 2022 at 1:17:12 PM UTC-6 carlton...@gmail.com >>> wrote: >>> >>>> Hey Pete. >>>> >>>> Yes, there can be a lot of steps... (and trouble is every one has a >>>> different opinion once you get to specifics :) >>>> >>>> django-webserver looks good β in a similar ballpark to what I had in >>>> mind, yes, but I'd probably not want to bundle the options for each server >>>> myself, as that seems a lot to maintain over time... (Better to outsource >>>> to the individual projects no?) >>>> >>>> Have you seen what Eric Matthes is doing with django-simple-deploy? >>>> >>>> https://github.com/ehmatthes/django-simple-deploy >>>> >>>> I really like the idea: in an opinionated way, it applies the project >>>> changes you need to deploy (and it's plugable so folks could provide a >>>> *template* for their own flavour of deployment if they wanted, which is >>>> kind of important given the number of options in the landscape, even if >>>> you >>>> only to *ship* a beginner option.) >>>> >>>> Tim Allen also recently raised improving the Django project template, >>>> which I think is related here. (That's on my list too: async this QTR, >>>> then >>>> hoping to take on Adam's proposal to modernise the Request object for the >>>> end of year, then π€ swinging back here for "OK, what does it look like, >>>> what can we do?" after that: there's a bunch of related tickets around >>>> #21978 that it would be very sweet if we could clear up...) >>>> >>>> I think all these thoughts are really pursuable outside of core in the >>>> very short run, even if the goal is to merge them β it's much easier to >>>> experiment that way, and then say, "This worked". >>>> >>>> Anyhow, other than a "I've been thinking along these lines", and a >>>> generally positive emote, I don't have too much more concrete at this >>>> stage. >>>> π >>>> C. >>>> >>>> On Tue, 23 Aug 2022 at 19:00, Peter Baumgartner <pe...@lincolnloop.com> >>>> wrote: >>>> >>>>> Thanks for the additional background Carlton! I like the idea of >>>>> having some sort of protocol that folks can follow to make >>>>> ready-to-use Django server packages (django-webserver [1] is in the >>>>> same vein), but I'd strive for more. pip install + INSTALLED_APPS is >>>>> great, but getting to production with that approach can feel like >>>>> death by a thousand paper cuts. Do that with gunicorn, whitenoise, >>>>> dj-database-url, etc. and it ends up being a laundry list of things >>>>> that, in my experience, people rarely get right on the first try and >>>>> just result in frustration. >>>>> >>>>> It seems like part of the challenge here is reaching parity with the >>>>> current runserver command, but is that necessary? Running `runserver >>>>> --dev` locally and getting dev features like autoreloading and then >>>>> having `runserver` use a different server for a deployed app doesn't >>>>> seem unreasonable. >>>>> >>>>> [1] https://github.com/lincolnloop/django-webserver >>>>> >>>>> On Tue, Aug 23, 2022 at 10:14 AM Carlton Gibson >>>>> <carlton...@gmail.com> wrote: >>>>> > >>>>> > Hey Pete. >>>>> > >>>>> > Yes... this is a good one. >>>>> > >>>>> > It's difficult to see how we can even have an ASGI runserver in >>>>> core, simply because there's no SimpleServer equivalent as there is for >>>>> WSGI, and it's not clear one is on the card. (HTTP is getting **more** >>>>> complex, and I can't see Python bringing such into the standard library.) >>>>> > So we have to use a third-party dependency for that. >>>>> > >>>>> > For the Channels v4 update (in progress now) I'm moving the >>>>> runserver command to the Daphne package. This was because folks wanted to >>>>> use Channels without the Daphne/Twisted dependency. >>>>> > >>>>> > See: https://github.com/django/daphne/pull/429 >>>>> > >>>>> > tl;dr β it came out pretty clean TBH. You pip install daphne, then >>>>> add "daphne" at the top of INSTALLED_APPS. (There's a system check to >>>>> make >>>>> sure you're not fighting staticfiles.) >>>>> > >>>>> > On the back of that I don't see why servers (any servers) can't >>>>> provide a runserver command (or a django-* mini-package to go with it) >>>>> and >>>>> offer what they offer in development as well as production. (Obviously >>>>> that >>>>> all needs writing but it's just a management command.) >>>>> > >>>>> > Related is strategising the reloader. >>>>> https://code.djangoproject.com/ticket/30213 >>>>> > >>>>> > We could then host *Protocols* β "Your runserver should do this", >>>>> "Implement this for your reloader", and so on β and (maybe) (slowly) >>>>> replace built-in options here with either optional dependencies (pip >>>>> install django["daphne"]) or recommendations to get going. (pip install >>>>> django["starter"] maybe). β I don't know β we seem a long way from that. >>>>> (I >>>>> don't suppose wsgiref is going anywhere too soon is it?) >>>>> > >>>>> > But to cut back to your point, I don't know that we need to >>>>> **include** a server β just make it easy to get going. These days pip >>>>> install + a line in INSTALLED_APPS doesn't seem too much to ask (I think.) >>>>> > >>>>> > Was it really 4 years ago Tom left that comment on #21978 π³ (We'd >>>>> finally close this as wontfix: Django doesn't ship a webserver.) >>>>> > >>>>> > Does that fit in your view, or would that scenario not be good >>>>> enough? >>>>> > >>>>> > Kind Regards, >>>>> > >>>>> > Carlton >>>>> > >>>>> > On Tue, 23 Aug 2022 at 16:56, Peter Baumgartner < >>>>> pe...@lincolnloop.com> wrote: >>>>> >> >>>>> >> Hi all! I'd like to re-open the discussion around >>>>> >> https://code.djangoproject.com/ticket/21978 >>>>> >> >>>>> >> As a "batteries included" framework, Django kind of leaves people to >>>>> >> fend for themselves when it comes to deployment. This makes it >>>>> harder >>>>> >> than necessary for a developer to go from works-on-my-laptop to >>>>> >> works-on-the-internet. The docs here are great, but also daunting >>>>> to a >>>>> >> newcomer https://docs.djangoproject.com/en/4.1/howto/deployment/ >>>>> >> >>>>> >> I'd love to see Django provide some sane defaults that people can >>>>> use >>>>> >> to deploy a site without having to make a bunch of decisions they >>>>> >> don't totally understand. >>>>> >> >>>>> >> I have two thoughts on how it could be handled: >>>>> >> >>>>> >> 1. Similar to the template backends. You get Django's template >>>>> system >>>>> >> by default, but you're welcome to swap in Jinja2. I don't believe >>>>> >> there is a one-size-fits-all webserver, but probably a >>>>> >> one-size-fits-most. >>>>> >> 2. Similar to cache/database backends. You define the backend you >>>>> want >>>>> >> to use and Django makes some sane choices for you and allows you to >>>>> >> serve the site via some common `manage.py` command. >>>>> >> >>>>> >> For the first option, Gunicorn is a popular choice, but afaik it >>>>> does >>>>> >> not work on Windows. Waitress [1] is an interesting option for WSGI >>>>> >> serving and daphne exists for ASGI. Whitenoise is a reasonable >>>>> choice >>>>> >> for serving static files. It doesn't yet support ASGI, but there has >>>>> >> been some activity on that front [2]. >>>>> >> >>>>> >> Thanks! >>>>> >> >>>>> >> [1] https://pypi.org/project/waitress/ >>>>> >> [2] https://github.com/evansd/whitenoise/pull/359 >>>>> >> >>>>> >> -- >>>>> >> You received this message because you are subscribed to the Google >>>>> Groups "Django developers (Contributions to Django itself)" group. >>>>> >> To unsubscribe from this group and stop receiving emails from it, >>>>> send an email to django-develop...@googlegroups.com. >>>>> >> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/django-developers/CAC6K9zk5PmcxYWXRdvco1pWXnO%2BHoYoYHf0pg5Mw%3DgmdefZArg%40mail.gmail.com >>>>> . >>>>> > >>>>> > -- >>>>> > You received this message because you are subscribed to the Google >>>>> Groups "Django developers (Contributions to Django itself)" group. >>>>> > To unsubscribe from this group and stop receiving emails from it, >>>>> send an email to django-develop...@googlegroups.com. >>>>> > To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/django-developers/CAJwKpyTSGPJW%2BmdUADW8eBYaXakesHG9H9dkSzhLxWnCpBdH6A%40mail.gmail.com >>>>> . >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "Django developers (Contributions to Django itself)" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to django-develop...@googlegroups.com. >>>>> >>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/django-developers/CAC6K9zmVDKcpM%3Dc9tyhrp2_K_dzLH5S9zMJcZSXduF9NkcoCKA%40mail.gmail.com >>>>> . >>>>> >>>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Django developers (Contributions to Django itself)" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to django-develop...@googlegroups.com. >>> >> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/django-developers/493f7f12-541c-4e12-ac25-0fd341ce2dc2n%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/django-developers/493f7f12-541c-4e12-ac25-0fd341ce2dc2n%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- > You received this message because you are subscribed to the Google Groups > "Django developers (Contributions to Django itself)" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to django-develop...@googlegroups.com. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/django-developers/c79db112-a965-4700-90b2-2bcdcd9d65a8n%40googlegroups.com > > <https://groups.google.com/d/msgid/django-developers/c79db112-a965-4700-90b2-2bcdcd9d65a8n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > > -- You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-developers+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/acbc93a2-5ff8-4933-99f8-012cec4e3a97n%40googlegroups.com.