1 of 17

Aplicații web în Python

2020

Curs introductiv de web development folosind Python și Django

2 of 17

Despre ce discutăm azi

Fișiere statice, media și file upload

  • Static files
  • Media files
  • FileField
  • Fixtures

3 of 17

Fișiere statice

  • Aplicațiile web trebuie să mai servească și fișiere adiționale precum images, JavaScript și CSS.

  • Aceste fișiere poartă denumirea în Django de fișiere statice.

  • Se utilizează modulul django.contrib.staticfiles pentru administrarea acestora.

4 of 17

Fișiere statice

Configurarea fișierelor statice:

  1. django.contrib.staticfiles trebuie inclus în INSTALLED_APPS
  2. În settings.py STATIC_URL = '/static/'
  3. În template, se folosește tag-ul static pentru a construi

URL-ul pentru path-ul respectiv

{% load static %}

<img src="{% static "my_app/example.jpg" %}">

  • Fișierele statice sunt stocate într-un folder numit static.

(my_app/static/js/example.js)

  • Adăugăm în urls.py (din proiect)

url_patterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT))

5 of 17

Servirea fișierelor statice

  • În development, fișierele statice vor fi automat servite de server-ul de development când DEBUG este setat pe True.

  • Totuși, această metodă este ineficienta și nesigură pentru producție, unde este recomandată utilizarea unui server special pentru servirea fișierelor statice (ex. nginx)

6 of 17

Fișiere media

  • În timp ce fișierele statice sunt folosite pentru servirea fișierelor javascript, css etc, fișierele media sunt utilizate pentru conținut încărcat de utilizatori.
  • În mod Default, Django stochează fișierele local, folosind parametrii MEDIA_ROOT și MEDIA_URL, declarați în fișierul settings.py.

7 of 17

Fișiere media

MEDIA_ROOT

- este calea absolută în sistem către directorul în care urmează să fie ținute fișierele încărcate de utilizatori.

- valoarea acestuia trebuie să fie diferită față de valoarea variabilei STATIC_ROOT

MEDIA URL

  • este url-ul sub care vor fi servite toate fișierele media
  • la fel ca în cazul lui MEDIA_ROOT, valoarea acestui atribut trebuie să fie diferită de cea din STATIC_URL

8 of 17

Fișiere media

În development, putem să servim fișiere încărcate de utilizatori adăugând următorul block în urls.py:

urlpatterns = [

# ... the rest of your URLconf goes here ...

] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)

9 of 17

File field

class MyModel(models.Model):

# file will be uploaded to MEDIA_ROOT/uploads

upload = models.FileField(upload_to='uploads/')

Acest tip de field primește două atribute opționale:

  • upload_to - acest atribut ne permite sa setam directorul si numele fisierului(eventual) în care ne dorim să fie salvat fișierul

  • storage - un obiect de tip storage, ce administrează modul în care este salvat și recuperat un fișier

10 of 17

File field

Un atribut al unui model de tip File field ne pune la dispoziție următoarele date:

  • name - numele fișierului

  • size - dimensiunea fișierului

  • url - o proprietate read-only pentru acesarea fisierului cu un URL relativ

11 of 17

FileField în Form și Template

în Form:

class UploadFileForm(forms.Form):

avatar = forms.FileField()

în Template:

<form method="post" enctype='multipart/form-data'>

<label for="id_avatar">Avatar</label>

<input type="file" name="avatar" id="id_avatar">

</form>

12 of 17

FileField în Form și Template

Cum afișăm un atribut de tip FileField?

{% if object.avatar %}

<img src="{{ object.avatar.url }}">

{% endif %}

13 of 17

Fixtures

  • Pentru anumite modele, este util să putem să pre-populăm datele cu date fixe.

  • Un fixture este o colecție de date pe care Django știe să le importe în baza de date.

  • Acestea pot să fie fișiere de tip JSON, XML sau YAML.

  • Acestea se definesc într-un director fixtures în fiecare aplicație

14 of 17

Fixtures

Fisier JSON

[

{

"model": "myapp.person",

"pk": 1,

"fields": {

"first_name": "John",

"last_name": "Lennon"

}

},

{

"model": "myapp.person",

"pk": 2,

"fields": {

"first_name": "Paul",

"last_name": "McCartney"

}

}

]

Fisier YAML

- model: myapp.person

pk: 1

fields:

first_name: John

last_name: Lennon

- model: myapp.person

pk: 2

fields:

first_name: Paul

last_name: McCartney

15 of 17

Fixtures

  • Cel mai ușor mod de generare a acestora este prin utilizarea comenzii dumpdata

Ex:

python manage.py dumpdata

  • se face dump în consolă la toată baza de date

python manage.py dumpdata app.Country

  • se face dump în consolă la tabelul precizat

python manage.py dumpdata app.Country > app/fixtures/countries.json

  • se face dump la tabelul precizat în fișierul pe care îl setăm

16 of 17

Fixtures

  • Pentru a încărca un fixture este utilizată comanda loaddata

Ex:

python manage.py loaddata countries.json

  • sunt încărcate datele din fișierul countries.json în baza de date

17 of 17

Ce a aparut nou în aplicație?

  • Funcționalitatea de unfriend
  • Adăugararea file field-ului avatar pe modelul UserProfile
  • Mutare fișiere statice local
  • Fixtures pentru modelul Countries