Understanding directory structure advice - django

I started to create in Django sample project, first command:
django-admin.py startproject test
gives me:
- root
- test
- __init__.py
- settings.py
- urls.py
- wsgi.py
- manage.py
Now I create first app:
python manage.py startapp foo
it created for me folder root/foo
so how I should understand my root/test folder. Is this folder for global config of my project and nothing more? (similar to Symfony 2 app folder)
I am confused because Django docs tells:
The inner mysite/ directory is the actual Python package for your
project
but manage.py startapp foo create app under root, not under root/test (mysite equivalent)
[EDIT]
Two commands:
python manage.py startapp app
and:
django-admin.py startapp app
gives me app inside project root, not under root/name_of_generated_project
Django 1.4
[EDIT] 2
Sorry guys, my fault, now is everything ok.
[EDIT] 3
I want to create another project again:
django-admin.py startproject jobeet
my initial structure is similar to above.
Now I want to try create app (inside jobeet folder):
django-admin.py startapp jobs
and I end up with jobeet/jobs not jobeet/jobeet/jobs
again :/
so inside my project root I have:
- jobeet
- jobs
- manage.py
another command:
python manage.py startapp app
gives me the same result

So let's say you create a new Django project testproject:
django-admin.py startproject testproject
This creates a new project with the following minimal set of files:
testproject/
├── __init__.py
├── manage.py
├── settings.py
└── urls.py
To create a new app for your first site mysite1 go into testproject directory and run:
python manage.py startapp mysite1
which results in a new directory mysite1 for the mysite1 app.
I.e. with just these two commands you would arrive at this hierarchy:
testproject/
├── __init__.py
├── manage.py
├── mysite1
│   ├── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── settings.py
└── urls.py
Refer to the django-admin.py and/or manage.py individual commands here.
In Django there is a one-to-many relationship between a project and an app. An app is usually one individual site component (e.g. comments, ratings), whereas a project is an organisation of several apps and can power many different sites. That's why you get the sites framework. In practice, one project usually serves one website, but with Django sites app with one project you can serve as many websites as you like, for reusability's sake.
P.S. I think creating a project simply called test is not a good practice because with Django unit tests at app level unit tests will go into a file called tests.py or within a folder called tests.
UPDATE for Django 1.4
As #zeantsoi has commented below, my answer:
applies to Django 1.3 and prior. Per the docs, beginning in 1.4, base
configuration files (including settings.py, urls.py, and wsgi.py) are
abstracted into a subdirectory titled the same name as the project.

"test" is the top level of your project. I've never used symphony 2 so I can't comment on that, but it seems like you have a grasp on it. The files that live in there are basically all global config files. Inside your "test" folder you should also have one or more app folders. Inside these app folders live the apps specific models, views, urls, etc.
It seems you've got something a little wrong your foo app should live in root/test/foo not root/foo.
Now in my projects I tend to have things like a virtualenv folder live in the root dir, but you definitively shouldn't have apps at that level (it just won't work)

manage.py doesn't provide a startproject command - that's usually a django-admin command. I'd check which manage.py you're executing, and ideally, use the manage.py from the project directory you've created.

Related

ModuleNotFound error Django and Heroku deployment

I am new to Django and to programming overall, and I am trying to deploy my personal website developed with Django to heroku.
I feel like I am at the last step but one error keeps bugging me and I cannot solve it on my own or with documentation.
My project folders are like this:
enter image description here
My Procfile:
enter image description here
My wsgi file:
enter image description here
And in the heroku logs I get the following:
2020-01-04T15:45:47.211072+00:00 app[web.1]: ModuleNotFoundError: No module named 'blog'
There are many blue lines but I believe this is the one that is problematic (i.e. not being able to find the settings file from this)
Is there anything else I can provide if this is not clear?
Thanks for any help
I welcome any questions
UPDATE!
So, I updated the db I use from SQLite3 to PostgreSQL and I still get a Server Error 500.
Here is my manage.py where I put the PostgreSQL:
DATABASE in manage.py
The app runs when I do manage.py runserver but it does not when heroku deploys it.
The heroku log looks like this:
heroku log
To summarise the process of investigating startup problems. There were two issues:
1. The project layout was different for local development and for production on heroku whereas the codebase was set up for highest level mysite as a homepath except wsgi.py file what caused spending extra time on troubleshooting.
.
├── Procfile <- web: gunicorn mysite.mysite.wsgi
├── mysite
│   ├── __init__.py
│   ├── blog
│   ├── db.sqlite3
│   ├── manage.py <- python manage.py runserver
│   ├── mysite
│   ├── static
│   ├── staticfiles
│   └── templates
├── requirements.txt
└── venv
Solution:
Fix codebase for mysite as a homepath and run gunicorn with either --chdir or --pythonpath setting to have a proper path settings for gunicorn.
--chdir: Chdir to specified directory before apps loading:
web: gunicorn --chdir mysite mysite.wsgi
--pythonpath: Add directories to the Python path
web: gunicorn --pythonpath mysite mysite.wsgi
2. Migrations. There wasn't any migration applying action.
Solution:
Adding release phase to Procfile which will apply migrations every time the app is deployed:
release: cd mysite && python manage.py migrate
After solving these two issues the app got up and running.

Structure in Django tutorial does not match match my strucuture

Starting a new project and realized that the structure for the tutorial and my structure do not match. It looks like a directory was created for the myproject and a directory AND a file were created for myapp... I don't understand. Is this correct?
Tutorial structure shows:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
My structure shows:
mysite/
myapp
myappp
__init__.py
settings.py
urls.py
wsgi.py
manage.py
#NinaPy, Your directory structure seems to be correct but there exist an issue.
Please follow the steps:
1) Go to your directory where you want to keep your project. Example--myproject folder
cd myproject
2) Now you are within your desired folder. run the command from CLI(Command Line Interface)
django-admin startproject mysite //mysite is the project name
it will create
1 directory[mysite] and 1 file[manage.py]
3) Now if you want to create an app: Go to mysite directory because manage.py exist in there.
cd mysite
run the command from CLI
python manage.py startapp myapp
It will create myapp in same level.
myproject/
mysite
manage.py
myapp
If you use the CLI then you are quite safe for folder directory and file structure. Do not try it to do manually unless you need some extra files.
Please have a look on here:
https://docs.djangoproject.com/en/3.0/intro/tutorial01/#creating-a-project
your can run python manage.py startproject to create a new project
yes its correct
before run type on terminal(enter the directory mysite)
cd mysite
then run
python manage.py runserver
python manage.py startapp appmane
........
..........

Django and Collectstatic Issue

I'm trying to deploy my Django web Application (2.0.1) thanks to Nginx and I'm getting an issue.
I configured the new Ubuntu server, add my Django Project and I downloaded nginx.
My Django project looks like :
Mysite
├── App1
├── App2
├── App3
├── lib
├── Global_variables.py
├── Mysite
├── settings.py
I have to make collectstatic with nginx, so I execute this command :
python manage.py collectstatic
But into my settings.py file, I have :
#from django.conf import global_settings
import os, datetime
import lib.Global_variables
And this issue :
File "/var/www/Mysite/Mysite/settings.py", line 16, in <module>
import lib.Global_variables
ImportError: No module named lib.Global_variables
However my import seems to be right. Any idea ?
To make directory a python package you need to add inside this directory __init__.py file. From the docs:
The init.py files are required to make Python treat the directories as containing packages; this is done to prevent directories with a common name, such as string, from unintentionally hiding valid modules that occur later on the module search path

Django: how to startapp inside an "apps" folder

I feel like I must be looking over something obvious because I am having trouble finding anything online about this. But basically here it is, I have a django Project, and I would like to store my apps inside of an apps folder, like thus...
myproject/
client-side/
media/
static/
templates/
apps/
app1/
app2/
etc.
__init__.py
manage.py
etc. (rest of root directory)
but have been unable to figure out how to >>>python manage.py startapp newapp and have it placed into the /apps/ folder. Is it ok to simply ok to startapp at the root level and manually move them into the /apps/ folder?
I greatly appreciate your thoughts and answers.
FYI running python 3.4.2 and Django 1.9.5 on Windows 10
You can specify the app's directory as a second parameter:
python manage.py startapp <app_name> <app_directory>
Note that no directory will be created, the app's files will be created directly in the specified directory. Example:
python manage.py startapp myapp apps/myapp
Will result in the given directory structure:
apps
└── myapp
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views.py
Also note that the command won't create the directory for you.
Edit: as another (now deleted) answer pointed out, running the command from the apps directory would also work:
cd apps
python ../manage.py startapp myapp
You can also use the django-admin command as well.
cd apps && django-admin startapp app_1
this will work as well

Should I work and create files in mysite or mysite/mysite?

I just started using django 1.4 and I realized that inside mysite there is another folder called mysite which has the same files as mysite.
Should I work and create files in mysite or mysite/mysite?
Starting with django 1.4, the default project structure changed, moving your main project files down into a packages. Apps will live in packages parallel to the main project.
Updated default project layout and manage.py
Though your layout example does not look like the default 1.4. Models should live in apps that you create. Run the following command in your project:
python manage.py startapp myapp
To get a layout like this:
manage.py
myapp/
__init__.py
models.py
mysite/
__init__.py
settings.py
urls.py