Attualmente stai utilizzando SQLite per il tuo progetto blog. Questo è sufficiente per scopi di sviluppo. Tuttavia, per un ambiente di produzione, avrai bisogno di un database più potente, ad esempio PostgreSQL, MySQL od Oracle. Modificheremo il nostro database per utilizzare PostgreSQL perché è molto più robusto e l'ORM (Object Relational Mapper) Django funziona molto meglio con esso.
Installare PostgreSQL
Se stai utilizzando Linux Ubuntu/Debian, installare pacchetti necessari per PostgreSQL di funzionare con Python come seguente:
$ sudo apt-get update
$ sudo apt-get install libpq-dev python3-dev
Poi installare PostgreSQL con il seguente comando:
$ sudo apt-get install postgresql postgresql-contrib
Su MacOS X, suggerisco di usare Homebrew, ti semplifica la vita. Non dimenticare di seguire le istruzioni Brew suggerisce dopo l'installazione. Installalo qui .
Apri l'app Terminale ed eseguire i seguenti comandi:
$ brew update
$ brew install postgresql
Su Windows scarica PostgreSQL da qui e installalo.
Inoltre è necessario installare l'adattatore Psycopg2 PostgreSQL per Python. Attivare il tuo ambiente virtuale Python ed eseguire il seguente comando per installarlo:
$ source venv/bin/activate
(venv)$ cd venv
(venv) ~/venv$ pip install psycopg2-binary==2.8.5
Creiamo un utente per il nostro database PostgreSQL. Apri il terminale ed eseguire i seguenti comandi:
$ sudo su - postgres # Enter your root password here
Ora dovresti essere in una sessione shell per l'utente postgres. Esegui i seguenti comandi:
$ createuser -d dj_tutorial --superuser # Enter your desired postgresql username here
$ createdb -O dj_tutorial blogdb # Enter your desired database name here
Ora accedi a una sessione Postgres ed impostare la password. Esegui i seguenti comandi:
$ psql
postgres=# ALTER USER dj_tutorial WITH PASSWORD 'Enter-your-desired-password-here';
Ricorda di terminare tutti i comandi al prompt SQL con un punto e virgola ;.
Prima di continuare nella configurazione Django e PostgreSQL, parliamo di fixtures Django.
Bonus: Fixtures Django
Fixtures sono dati iniziali per il database. Il modo più semplice per creare un fixture se hai già dei dati è quello di utilizzare il comando dumpdata. Più avanti in questo tutorial chiameremo il comando loaddata per ripristinare i dati nel database.
Impostare fixtures Django
Apri il file settings.py del progetto ed aggiungere il codice seguente:
# mysite/settings.py
...
FIXTURE_DIRS = [
os.path.join(BASE_DIR, "fixtures")
]
...
Creare una nuova cartella nella directory dell'applicazione blog e nominarla fixtures. Questo è dove Django trova i file fixture.
NB:
Ora esegui il seguente comando:
$ python manage.py dumpdata --natural-foreign --format=json --exclude=auth.permission --exclude=contenttypes --indent=4 > blog/fixtures/blog.json
Il comando precedente eseguirà il backup del database in un file blog.json.
I formati di file possibili sono: JSON, XML o YAML (con PyYAML installato).
Apri il file json generato dal comando dumpdata, dovresti vedere qualcosa di simile:
[
{
"model": "auth.user",
"pk": 1,
"fields": {
"password": "pbkdf2_sha256$180000$hVC2VNBsBp7g$YZ0eAgNbllEtGXAfPpjrKKyyIJVE9OpieElG+fLQd8c=",
"last_login": "2020-03-23T11:47:00.153Z",
"is_superuser": true,
"username": "admin",
"first_name": "",
"last_name": "",
"email": "[email protected]",
"is_staff": true,
"is_active": true,
"date_joined": "2020-01-05T00:25:50.532Z",
"groups": [],
"user_permissions": []
}
},
{
"model": "sessions.session",
"pk": "cwnzmfy8yerypza0ar3wed1zyys7p4p1",
"fields": {
"session_data": "OTQ0YzI0ZmYyMTI3ZjAwN2I0MjI1YTAyYTQzYWViM2IwN2U5YmFmNTp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJkOGI1ODE5MjQ1NDkwNDdlYTIyOTg3Mjg3NGNlNGExYTk1NTRmNzg4In0=",
"expire_date": "2020-01-21T21:51:39.122Z"
}
},
{
"model": "sessions.session",
"pk": "i767zn7ow1zdwazz42glfmss5dooeqg5",
"fields": {
"session_data": "OTQ0YzI0ZmYyMTI3ZjAwN2I0MjI1YTAyYTQzYWViM2IwN2U5YmFmNTp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJkOGI1ODE5MjQ1NDkwNDdlYTIyOTg3Mjg3NGNlNGExYTk1NTRmNzg4In0=",
"expire_date": "2020-01-25T23:40:31.767Z"
}
},
{
"model": "sessions.session",
"pk": "o7soi3vqo0sjr60vscad2zz8lb4wez79",
"fields": {
"session_data": "OTQ0YzI0ZmYyMTI3ZjAwN2I0MjI1YTAyYTQzYWViM2IwN2U5YmFmNTp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJkOGI1ODE5MjQ1NDkwNDdlYTIyOTg3Mjg3NGNlNGExYTk1NTRmNzg4In0=",
"expire_date": "2020-04-06T11:47:00.162Z"
}
},
{
"model": "sessions.session",
"pk": "ot6rcg11uji68y7xc1qraoxwi1k8ac11",
"fields": {
"session_data": "OTQ0YzI0ZmYyMTI3ZjAwN2I0MjI1YTAyYTQzYWViM2IwN2U5YmFmNTp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJkOGI1ODE5MjQ1NDkwNDdlYTIyOTg3Mjg3NGNlNGExYTk1NTRmNzg4In0=",
"expire_date": "2020-01-19T00:26:43.369Z"
}
},
{
"model": "sessions.session",
"pk": "top4gp1goqzfw3x32lbokj5pbzo82v1t",
"fields": {
"session_data": "OTQ0YzI0ZmYyMTI3ZjAwN2I0MjI1YTAyYTQzYWViM2IwN2U5YmFmNTp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJkOGI1ODE5MjQ1NDkwNDdlYTIyOTg3Mjg3NGNlNGExYTk1NTRmNzg4In0=",
"expire_date": "2020-01-21T20:35:02.116Z"
}
},
{
"model": "sites.site",
"pk": 1,
"fields": {
"domain": "localhost:8000",
"name": "localhost:8000"
}
},
{
"model": "blog.post",
"pk": 2,
"fields": {
"title": "the gods of our ancestors",
"slug": "the-gods-of-our-ancestors",
"author": [
"admin"
],
"body": "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
"publish": "2020-01-06T19:26:34Z",
"created": "2020-01-06T19:27:16.261Z",
"updated": "2020-01-11T23:40:52.422Z",
"status": "published"
}
},
{
"model": "blog.post",
"pk": 3,
"fields": {
"title": "django is the best python web framework",
"slug": "django-best-python-web-framework",
"author": [
"admin"
],
"body": "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).",
"publish": "2020-01-11T23:45:03Z",
"created": "2020-01-11T23:47:08.597Z",
"updated": "2020-01-11T23:47:08.597Z",
"status": "published"
}
},
{
"model": "blog.post",
"pk": 4,
"fields": {
"title": "python is my favourite programming language",
"slug": "python-my-favourite-programming-language",
"author": [
"admin"
],
"body": "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).",
"publish": "2020-01-11T23:48:08Z",
"created": "2020-01-11T23:49:04.859Z",
"updated": "2020-01-11T23:49:04.859Z",
"status": "published"
}
},
{
"model": "admin.logentry",
"pk": 1,
"fields": {
"action_time": "2020-01-06T19:22:41.135Z",
"user": [
"admin"
],
"content_type": [
"blog",
"post"
],
"object_id": "1",
"object_repr": "the gods of our ancestor",
"action_flag": 1,
"change_message": "[{\"added\": {}}]"
}
},
{
"model": "admin.logentry",
"pk": 2,
"fields": {
"action_time": "2020-01-06T19:26:01.347Z",
"user": [
"admin"
],
"content_type": [
"blog",
"post"
],
"object_id": "1",
"object_repr": "the gods of our ancestors",
"action_flag": 2,
"change_message": "[{\"changed\": {\"fields\": [\"Title\"]}}]"
}
},
{
"model": "admin.logentry",
"pk": 3,
"fields": {
"action_time": "2020-01-06T19:26:31.430Z",
"user": [
"admin"
],
"content_type": [
"blog",
"post"
],
"object_id": "1",
"object_repr": "the gods of our ancestors",
"action_flag": 3,
"change_message": ""
}
},
{
"model": "admin.logentry",
"pk": 4,
"fields": {
"action_time": "2020-01-06T19:27:16.262Z",
"user": [
"admin"
],
"content_type": [
"blog",
"post"
],
"object_id": "2",
"object_repr": "the gods of our ancestors",
"action_flag": 1,
"change_message": "[{\"added\": {}}]"
}
},
{
"model": "admin.logentry",
"pk": 5,
"fields": {
"action_time": "2020-01-11T23:40:52.432Z",
"user": [
"admin"
],
"content_type": [
"blog",
"post"
],
"object_id": "2",
"object_repr": "the gods of our ancestors",
"action_flag": 2,
"change_message": "[{\"changed\": {\"fields\": [\"Status\"]}}]"
}
},
{
"model": "admin.logentry",
"pk": 6,
"fields": {
"action_time": "2020-01-11T23:47:08.598Z",
"user": [
"admin"
],
"content_type": [
"blog",
"post"
],
"object_id": "3",
"object_repr": "django is the best python web framework",
"action_flag": 1,
"change_message": "[{\"added\": {}}]"
}
},
{
"model": "admin.logentry",
"pk": 7,
"fields": {
"action_time": "2020-01-11T23:49:04.868Z",
"user": [
"admin"
],
"content_type": [
"blog",
"post"
],
"object_id": "4",
"object_repr": "python is my favourite programming language",
"action_flag": 1,
"change_message": "[{\"added\": {}}]"
}
},
{
"model": "admin.logentry",
"pk": 8,
"fields": {
"action_time": "2020-03-08T16:39:04.495Z",
"user": [
"admin"
],
"content_type": [
"sites",
"site"
],
"object_id": "1",
"object_repr": "localhost:8000",
"action_flag": 2,
"change_message": "[{\"changed\": {\"fields\": [\"Domain name\", \"Display name\"]}}]"
}
}
]
Configurare Django con un database PostgreSQL
Modifica il file settings.py del progetto alla voce DATABASES ed aggiungi il codice seguente:
# mysite/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': 'dj_tutorial',
'NAME': 'blogdb',
'HOST': 'localhost',
'PASSWORD': '**********',
'PORT': '',
},
}
Attenzione: Non divulgare mai informazioni sensibili, tenerle segrete.
Sostituire i dati precedenti con il nome del database e le credenziali per l'utente che hai creato. Il nuovo database è vuoto. Eseguire il seguente comando per applicare tutte le migrazioni del database:
$ python manage.py migrate
Infine possiamo chiamare il comando loaddata per ricaricare (ripristinare) i dati nel database. Esegui il seguente comando:
$ python manage.py loaddata blog
Ora esegui il server di sviluppo, apri http://localhost:8000/blog/ nel tuo browser noterai che i nostri posts sono rimasti gli stessi come mostrato nella seguente schermata:
per ora è tutto, rimani connesso per funzionalità più utili.
Se ti piace il mio contenuto, supportami! grazie.