Göm menyn

TDDD80 Projekt: Mobila och sociala applikationer

Laboration S1: Server-kod


Syfte

Laborationen går ut på att skapa ett REST-baserat backend med python+Flask. Syftet med laborationen är att sätta upp ett REST-api för en applikation som hanterar meddelanden. I denna laboration ska inte backend-delen kopplas samman med någon klient, utan ni kommer att anropa REST-api:t genom fake-anrop. Notera att så länge er lösning uppfyller spec:en nedanför, har ni fria händer att bestämma hur ni vill lösa uppgiften (det är t.ex. inte sagt hur ett meddelandes id ska genereras, och hur den ska kommuniceras mellan fake-klient och server, när ett nytt meddelande ska läggas in, etc.).

Genomförande

Första steget i laborationen är att utforska (Googla) och skriftligt förklara viktiga grundbegrepp. Det är viktigt att ni för varje svar lägger med de URL:er (länkar) som ni har bedömt vara trovärdiga och som ni har använt för att sammanställa ert svar. (Svaren lämnas in i README-fil i Gitlab, tillsammans med labb-koden):

  1. Vad skiljer ett ramverk (framework) från ett bibliotek (library)?
  2. Vilka fördelar erbjuder ramverk, och specifikt Flask, vid utveckling av server-kod jämfört med ren python?
  3. Vad är en session i server-sammanhang? Och hur fungerar en 'session' i Flask?

Laborationen genomförs i par. Ni kommer att ha tillgång till PyCharm Professional i kursen som är ett populärt verktyg för Python-utveckling. Förutom denna, ansvarar ni själva för att installera nödvändiga bibliotek för att utveckla med Python+Flask+requests. I denna laboration kommer ni att behöva installera biblioteken flask och requests.

I denna laboration kommer vi inte använda oss av någon databas, detta kommer läggas till i senare laborationer. För denna laboration kommer all information enbart lagras i interna variabler i python, så som listor och/eller dictionary.

Krav

  • Skapa en virtuell python miljö och installera Flask
  • Skapa en REST-applikation i Python+Flask
  • Det skall finnas möjlighet att via ett HTTP-anrop till den utvecklade applikationen spara ett nytt meddelande
  • Det skall finnas möjlighet att via ett HTTP-anrop till den utvecklade applikationen markera ett meddelande som läst av en unik användare
  • Det skall finnas möjlighet att via ett HTTP-anrop till den utvecklade applikationen hämta ett meddelande med givet ID
  • Det skall finnas möjlighet att via ett HTTP-anrop till den utvecklade applikationen hämta alla meddelanden
  • Det skall finnas möjlighet att via ett HTTP-anrop till den utvecklade applikationen hämta alla olästa meddelanden för en unik användare
  • Det skall finnas möjlighet att via ett HTTP-anrop till den utvecklade applikationen att ta bort ett medelande med givet ID
  • Om anropet inte mappar mot en funktion skall HTTP 404 returneras.
  • Om anropet använder fel metod skall HTTP 405 returneras.
  • Om anropet använder felaktiga eller saknar parameterar skall HTTP 400 returneras.
  • Vid alla andra fel returneras HTTP 500.
  • Alla anrop till applikationen skall ske enligt specifikation 1.
  • Kod ska versionshanteras med git via gitlab.liu.se

Ladda nödvändiga programmoduler

Börja med att ladda programmodulen för att kunna köra PyCharm:

  • module load prog/pycharm-professional/2022.3.1

Skapa en virtuell python miljö

Starta en terminal och ställ dig i er labbmapp, dvs. där er labbkod kommer att finnas. De olika labbarna i kursen kan med fördel läggas i en gemensam mapp. Ställ dig i denna mapp. Skriv sedan följande instruktioner i terminalen:

  • python3 -m venv my_env
  • source my_env/bin/activate (för att aktivera och använda din virtuella miljö)

På detta sätt har du skapat en körningsmiljö för din kod där specifika bibliotek kan installeras utan att det stör andra projekt som du kanske också håller på med (t.ex. i andra kurser).

Installera Flask och requests i din virtuella miljö (du måste stå i en terminal med din virtuella miljö aktiverad):

  • pip3 install flask
  • pip3 install requests

Starta upp PyCharm

För att starta PyCharm i Linux-PUL kan du skriva följande i en terminal:

  • pycharm.sh

Använd din nya virtuella miljö som din python-tolk, genom att ange detta i PyCharm. Du ska m.a.o. i PyCharms File > Settings > Project settings > Python interpreter peka ut bin/python3 i din virtuella miljö. Det går även bra att ange detta direkt, i samband med att du skapar ett nytt projekt i PyCharm.

Testa webbanrop via python

Använd dig av Python Requests för att testa alla HTTP-anrop. Du kan med fördel samla alla anrop i en python skript-fil, så att alla anrop körs varje gång du kör skript-filen. Skript-filen kommer du att vilja köra i en separat terminal, medan din backend kör i sin egen terminal (eller i PyCharm). Anropen ska täcka ovanstående kravlista, dvs. ska testa var och en av dina metoder, dels med anrop som bör lyckas, dels med anrop som ska trigga rätt felmeddelande.

Redovisa

  1. Muntligt redovisa/demonstrera er laboration för er assistent
  2. Ladda upp söknings-svaren inkl. länkar (i README-fil), samt er kod (alla relevanta filer för labben) (gärna kontinuerligt) till ert gitlab-projekt
  3. Lägg till er assistent som Reporter på ert gitlab-projekt
  4. Meddela er assistent att ni lagt upp koden genom att skicka ett mejl. Märk mejlet med TDDD80: Labb S1, och se till att det finns en länk till repot i mejlet.

Specifikation 1

Funktion Anrop Metod Parameter Returvärde
Spara ett meddelande /messages POST JSON-sträng med ett meddelande på max 140 tecken

{
  'id': '47cc67093475061e3d95369d'
}
  		
Hämta ett meddelande /messages/<MessageID> GET MessageID

 {
  'id': '47cc67093475061e3d95369d',
  'message': 'Hej!',
  'readBy': ['userId', ...]
 }
		
Ta bort meddelande /messages/<MessageID> DELETE MessageID HTTP 200
Markera som läst /messages/<MessageID>/read/<UserId> POST MessageID,UserId HTTP 200
Hämta alla meddelanden /messages GET
[
 {
  'id': '47cc67093475061e3d95369d',
  'message': 'Hej!',
  'readBy': ['userId', ...]
 },
 {
  'id': '875a47093475061e3d95369d',
  'message': 'Hej igen!',
  'readBy': []
 },
...]
		
Hämta olästa meddelanden för användare /messages/unread/<UserId> GET UserId
[
 {
  'id': '47cc67093475061e3d95369d',
  'message': 'Hej!',
  'readBy': ['userId', ...]
 },
 {
  'id': '875a47093475061e3d95369d',
  'message': 'Hej igen!',
  'readBy': []
 },
...]
		

Sidansvarig: Rita Kovordanyi
Senast uppdaterad: 2023-01-15