element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet & Tria Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • About Us
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      • Japan
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      • Vietnam
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
Raspberry Pi
  • Products
  • More
Raspberry Pi
Blog Pi Passport: Schritt 4 - Admin-Bereich
  • Blog
  • Forum
  • Documents
  • Quiz
  • Events
  • Polls
  • Files
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join Raspberry Pi to participate - click to join for free!
Featured Articles
Announcing Pi
Technical Specifications
Raspberry Pi FAQs
Win a Pi
GPIO Pinout
Raspberry Pi Wishlist
Comparison Chart
Quiz
  • Share
  • More
  • Cancel
Group Actions
  • Group RSS
  • More
  • Cancel
Engagement
  • Author Author: charlotte_godley
  • Date Created: 7 Oct 2014 1:37 PM Date Created
  • Views 405 views
  • Likes 0 likes
  • Comments 0 comments
Related
Recommended
  • b+
  • raspberry-pi-bplus
  • pipassport
  • tagged
  • explore-nfc
  • raspberry_pi
  • raspberry-pi
  • raspberrypib+
  • raspberrypi
  • nfc
  • deutsch
  • charlotte_godley

Pi Passport: Schritt 4 - Admin-Bereich

charlotte_godley
charlotte_godley
7 Oct 2014

Links zu vorherigen Tutorials: Eins, Zwei und Drei.

Im letzten Beitrag zu unserem PiPassport Projekt haben wir gemeinsam eine Klassifizierung für NFCs erstellt, mit denen wir einzelne Benutzereinträge sowie auch
Aktivitäten an verschiedenen Stationen speichern und laden können.
Nach dem letzten Tutorial sollte Ihre nfc.py-Datei in etwa so aussehen:

+ expand sourceview plain
  1. import nxppy 
  2. import os,json,requests 
  3. from xml.dom import minidom 
  4.  
  5. class NFC(object): 
  6.             def __init__(self,pifile,peoplefile): 
  7.                         self.pi=pifile 
  8.                         self.peoplef=peoplefile 
  9.  
  10.  
  11.                         self.achievements=self.LoadPi() 
  12.                         self.people=self.LoadPeople() 
  13.  
  14.             def ReadCard(self): 
  15.                         id=nxppy.read_mifare() 
  16.                         if id == None: 
  17.                                     return None 
  18.                         else: 
  19.                                     if id not in self.people.keys(): 
  20.                                                 print "new ID :", id 
  21.                                                 name=raw_input('Please enter your name:') 
  22.                                                 self.people[id]={"name":name,"achievements":[]} 
  23.                                     else: 
  24.                                                 for aid in self.achievements.keys(): 
  25.                                                             if aid not in self.people[id]['achievements']: 
  26.                                                                         if self.achievements[aid]['question']==None: 
  27.                                                                                     self.people[id]['achievements'].append(aid) 
  28.                                                                                     print "Achievement unlocked!" 
  29.                                                                         else: 
  30.                                                                                     print self.achievements[aid]['question'] 
  31.                                                                                     ans=[] 
  32.                                                                                     for a in range(len(self.achievements[aid]['answers'])): 
  33.                                                                                                 answer=raw_input('Enter answer:') 
  34.                                                                                                 ans.append(answer) 
  35.                                                                                     correct=0 
  36.                                                                                     for an in range(len(ans)): 
  37.                                                                                                 found=False 
  38.                                                                                                 for answ in self.achievements[aid]['answers']: 
  39.                                                                                                             if answ==ans[an]: 
  40.                                                                                                                         found=True 
  41.                                                                                                                         break 
  42.                                                                                                 if not found: 
  43.                                                                                                             print "answer " + str(ans[an]) + " incorrect!" 
  44.                                                                                                 else: 
  45.                                                                                                             correct+=1 
  46.                                                                                     if correct == len(self.achievements[aid]['answers']): 
  47.                                                                                                 print "achievement unlocked!"             
  48.                                                                                                 self.people[id]['achievements'].append(aid) 
  49.                                     self.SavePeople() 
  50.                                     return self.people[id] 
  51.             def Load(self,file,type): 
  52.                         if os.path.exists(file): 
  53.                                     source=open(file) 
  54.                                     try: 
  55.                                                 dom1=minidom.parse(source) 
  56.                                     except: 
  57.                                                 impl=minidom.getDOMImplementation() 
  58.                                                 dom1=impl.createDocument(None,type,None) 
  59.                                     return dom1 
  60.                         else: 
  61.                                     impl=minidom.getDOMImplementation() 
  62.                                     doc=impl.createDocument(None, type,None) 
  63.                                     return doc 
  64.  
  65.             def LoadPi(self): 
  66.                         dom=self.Load(self.pi,"piSyst") 
  67.                         try: 
  68.                                     pi_tag=dom.getElementsByTagName("pi")[0] 
  69.                         except: 
  70.                                     self.SavePi() 
  71.                                     dom=self.Load(self.pi,"piSyst") 
  72.                                     pi_tag=dom.getElementsByTagName("pi")[0] 
  73.                         a_tags=pi_tag.getElementsByTagName("achievement") 
  74.                         achievements={} 
  75.                         achievements[pi_tag.getAttribute("ID")]={"question":None,"answers":None} 
  76.                         for a in a_tags: 
  77.                                     id=a.getAttribute("ID") 
  78.                                     qtag=a.getElementsByTagName("question")[0] 
  79.                                     question=qtag.childNodes[0].data 
  80.                                     atag=a.getElementsByTagName("answer") 
  81.                                     answers=[] 
  82.                                     for an in atag: 
  83.                                                 answers.append(an.childNodes[0].data) 
  84.                                     achievements[id]={"question":question,"answers":answers} 
  85.                         return achievements 
  86.  
  87.             def SavePi(self): 
  88.                         dom=self.Load(self.pi,"piSyst") 
  89.                         top=dom.documentElement 
  90.                         if(len(dom.getElementsByTagName("pi"))==0): 
  91.                                     pi=dom.createElement("pi") 
  92.                                     id=0 
  93.                                     pi.setAttribute("ID",str(id)) 
  94.                                     top.appendChild(pi) 
  95.                                     file=open(self.pi,'w') 
  96.                                     dom.writexml(file) 
  97.                         else: 
  98.                                     old_achievements=self.LoadPi() 
  99.                                     pitag=dom.getElementsByTagName("pi")[0] 
  100.                                     if old_achievements != self.achievements: 
  101.                                                 try: 
  102.                                                             os.remove(self.pi) 
  103.                                                 except Exception, e: 
  104.                                                             print str(e) 
  105.                                                             pass 
  106.                                                 dom=self.Load(self.pi,"piSyst") 
  107.                                                 top=dom.documentElement 
  108.                                                 pitag=dom.createElement("pi") 
  109.                                                 id=0 
  110.                                                 pitag.setAttribute("ID",str(id)) 
  111.                                                 top.appendChild(pitag) 
  112.                                                 for id,a in self.achievements.iteritems(): 
  113.                                                             if a["question"]!=None: 
  114.                                                                         ac=dom.createElement("achievement") 
  115.                                                                         ac.setAttribute("ID",id) 
  116.                                                                         q=dom.createElement("question") 
  117.                                                                         text=dom.createTextNode(str(a["question"])) 
  118.                                                                         q.appendChild(text) 
  119.                                                                         ac.appendChild(q) 
  120.                                                                         for answer in a["answers"]: 
  121.                                                                                     ans=dom.createElement("answer") 
  122.                                                                                     txt=dom.createTextNode(str(answer)) 
  123.                                                                                     ans.appendChild(txt) 
  124.                                                                                     ac.appendChild(ans) 
  125.                                                             pitag.appendChild(ac) 
  126.                                                 file=open(self.pi,'w') 
  127.                                                 dom.writexml(file) 
  128.              
  129.             def LoadPeople(self): 
  130.                         dom=self.Load(self.peoplef,"People") 
  131.                         p_tags=dom.getElementsByTagName("person") 
  132.                         people={} 
  133.                         for p in p_tags: 
  134.                                     id=p.getAttribute("ID") 
  135.                                     ntag=p.getElementsByTagName("name")[0] 
  136.                                     name=ntag.childNodes[0].data 
  137.                                     atag=p.getElementsByTagName("achievement") 
  138.                                     achievements=[] 
  139.                                     for a in atag: 
  140.                                                 if a.childNodes[0].data not in achievements: 
  141.                                                             achievements.append(a.childNodes[0].data) 
  142.                                     people[id]={"name":name,"achievements":achievements} 
  143.                         return people 
  144.  
  145.             def SavePeople(self): 
  146.                         dom=self.Load(self.peoplef,"People") 
  147.                         top=dom.documentElement 
  148.                         old_p=self.LoadPeople() 
  149.                         people_tags=top.getElementsByTagName("person") 
  150.                         for id,p in self.people.iteritems(): 
  151.                                     if id in old_p.keys(): 
  152.                                                             for pe in people_tags: 
  153.                                                                         if pe.getAttribute("ID")==id: 
  154.                                                                                     for achievement in p["achievements"]: 
  155.                                                                                                 if achievement not in old_p[id]["achievements"]: 
  156.                                                                                                             ac_tag=dom.createElement("achievement") 
  157.                                                                                                             ac_text=dom.createTextNode(achievement) 
  158.                                                                                                             ac_tag.appendChild(ac_text) 
  159.                                                                                                             pe.appendChild(ac_tag) 
  160.                                     else: 
  161.                                                 peep=dom.createElement("person") 
  162.                                                 peep.setAttribute("ID",id) 
  163.                                                 n=dom.createElement("name") 
  164.                                                 text=dom.createTextNode(str(p["name"])) 
  165.                                                 n.appendChild(text) 
  166.                                                 peep.appendChild(n) 
  167.                                                 for achievement in p["achievements"]: 
  168.                                                             ac=dom.createElement("achievement") 
  169.                                                             txt=dom.createTextNode(str(achievement)) 
  170.                                                             ac.appendChild(txt) 
  171.                                                             peep.appendChild(ac) 
  172.                                                 top.appendChild(peep) 
  173.                         file=open(self.peoplef,'w') 
  174.                         dom.writexml(file) 
  175.  
  176.  
  177.             def AddAchievement(self,desc,question,answers): 
  178.                         return None 
  179.              
  180.             def UpdateAchievement(self,updated_entry): 
  181.                         return None 
  182.  
  183.             def DeleteAchievement(self,id): 
  184.                         return None 
  185.  
  186.             def GetAchievement(self, id): 
  187.                         if id in self.achievements.keys(): 
  188.                                     return self.achievements[id] 
  189.                         else: 
  190.                                     return None 
                                  


Jetzt, da Sie über eine Infrastruktur verfügen, machen wir mit den letzten beiden Methoden-Stubs weiter. Diese ermöglichen es uns, Aktivitäten anzupassen.
Da die Dateiverarbeitung an einer anderen Stelle stattfindet, sind die weiteren Schritte relativ einfach:

   
+ expand sourceview plain
  1.             def AddAchievement(self,desc,question,answers): 
  2.                         ids=[int(i) for i in self.achievements.keys()] 
  3.                         sorted_ids=sorted(ids) 
  4.                         id=sorted_ids[-1]+1 
  5.                         self.achievements[str(id)]={"question":question,"answers":answers,"Description":desc} 
  6.                         self.SavePi() 
  7.              
  8.             def UpdateAchievement(self,updated_entry): 
  9.                         if id in self.achievements.keys(): 
  10.                                     self.achievements[id]=updated_entry 
  11.                         else: 
  12.                                     print "Achievement not found" 
  13.  
  14.             def DeleteAchievement(self,id): 
  15.                         if id in self.achievements.keys(): 
  16.                                     del self.achievements[id] 
  17.                         else: 
  18.                                     print "Achievement not found" 

Wir fangen ganz oben an: „Add“ (Erstellen) stellt ganz einfach anhand der höchsten ID fest, welche ID als nächstes kommt. Dazu zieht dieser Befehl ein Verzeichnis aller Aktivitäten-IDs heran, ordnet diese aufsteigend an,
nimmt dann den letzten Eintrag (sorted_ids[-1]) und fügt ihm eine 1 hinzu.
Diesen Eintrag fügen wir nun hinzu und speichern die Datei.
„Update“ (Aktualisieren) ist sogar noch einfacher – dieser Befehl findet einen Eintrag und tauscht ihn mit einer anderen Verzeichnisreferenz aus, die von der Admin-Seite vervollständigt wird.
„Delete“ (Löschen) prüft, ob eine ID vorliegt, und löscht sie.
Jetzt können wir nfc.py schließen und eine Admin-Seite erstellen. Drücken Sie also STRG+X, Y und Eingabe.
Geben Sie anschließend sudo nano admin.py und folgenden Stub ein:

+ expand sourceview plain
  1. from nfc import NFC 
  2.  
  3. class UI(object): 
  4.             def __init__(self,pi,people): 
  5.                         self.NFC=NFC(pi,people) 
  6.                         self.CRUD={1:self.View,2:self.Create,3:self.Update,4:self.Delete,5:self.Quit} 
  7.  
  8.             def Menu(self): 
  9.                         print "Welcome to xyz admin." 
  10.                         print "1. View Achievements" 
  11.                         print "2. Add Achievements" 
  12.                         print "3. Update Achievements" 
  13.                         print "4. Remove Achievements" 
  14.                         print "5. Quit" 
  15.                         valid=False 
  16.                         while not valid: 
  17.                                     input=raw_input('Enter an option:') 
  18.                                     validate=self.ValidateChoice(input) 
  19.                                     if validate == True: 
  20.                                                 valid=True 
  21.                                     else: 
  22.                                                 print validate 
  23.                         self.CRUD[int(input)]() 
  24.  
  25.             def View(self): 
  26.                         return None 
  27.  
  28.             def Create(self): 
  29.                         return None 
  30.  
  31.             def Update(self): 
  32.                         return None 
  33.                                                  
  34.             def Delete(self): 
  35.                         return None 
  36.  
  37.             def Quit(self): 
  38.                         return None 
  39.  
  40.             def ValidateChoice(self,item): 
  41.                         inte=self.ValidateInt(item) 
  42.                         if not inte: 
  43.                                     return "Entry not an integer" 
  44.  
  45.                         if int(item) not in self.CRUD.keys(): 
  46.                                     return str(item)+ " not in list" 
  47.                         else: 
  48.                                     return True 
  49.              
  50.             def ValidateInt(self,item): 
  51.                         try: 
  52.                                     val=int(item) 
  53.                                     return True 
  54.                         except: 
  55.                                     return False 
  56.             def ProcessEntry(self,string): 
  57.                         valid=False 
  58.                         while not valid: 
  59.                                     id=raw_input('Please enter a valid ' +string+ ': ') 
  60.                                     valid=self.ValidateInt(id) 
  61.                                     if not valid: 
  62.                                                 print "Invalid number" 
  63.                         return id 
  64.  
  65. self=UI('pi.xml','people.xml') 
  66.  
  67. self.Menu() 
                                  


Wir erstellen nun eine menügesteuerte Benutzerschnittstelle. Diese ist vergleichbar mit automatisierten Telefonansagen wie „Drücken Sie die 1 hierfür, die 2 dafür und die 3, um mit einem Ansprechpartner verbunden zu werden“.
Da wir sie jedoch lesen können, ist es wesentlich einfacher, damit zu arbeiten. Alle Optionen werden im Menü() angezeigt. Hier kann der Benutzer dann seine Auswahl treffen.
Falls der Benutzer eine ungültige Auswahl trifft, wird dies sofort durch die ValidateChoice-Methode gekennzeichnet. Diese Methode überprüft, ob ein Eintrag ein Integer ist und ob sich die ID im CRUD-Verzeichnis wiederfindet.
Das CRUD-Verzeichnis, das wir beim „init“ festgelegt haben (self.CRUD), ist ziemlich speziell, da es nicht über Daten verfügt, sondern jeder ID eine Methode hinzufügt. So werden Switch-Case-Anweisungen in Python ersetzt,
die nicht existieren – in Programmiersprachen wie C, C++, C#, Java und vielen weiteren funktioniert ein Switch-Case wie folgt:

+ expand sourceview plain
  1. value=user_input; 
  2. switch(value){ 
  3.             case 0: 
  4.                         DoSomething(); 
  5.                         break 
  6.              
  7.             case 1: 
  8.                         DoSomethingElse(); 
  9.                         break; 
  10.              
  11.             default: 
  12.                         DoSomethingIfAllOtherOptionsArentChosen(); 
  13.                         break; 
  14.             } 

So kann der Code in viele verschiedene Richtungen ausgelegt werden, je nachdem, welche Auswahl getroffen wird. Das kann Python zwar nicht, aber unser Verzeichnis funktioniert ganz genau so. Sobald wir wissen, dass die Benutzereingabe gültig ist, wird dieses Verzeichnis also aufgerufen.
Die andere Methode, auf die ich bisher noch nicht eingegangen bin – ProcessEntry – wird immer dann aufgerufen, wenn wir sie benötigen. Das ermöglicht es uns, einen Benutzer immer wieder um eine gültige Eingabe zu bitten, bis endlich eine für uns verwertbare Eingabe erfolgt ist.
Diese Methode können wir allerdings nicht in unserem Menü verwenden, da wir nicht nur einen gültigen Integer benötigen, sondern der Eintrag auch in einer bestimmten Liste vorkommen muss, was für spätere Einträge jedoch nicht gilt.
Wenn der Benutzer jetzt jedoch eine Auswahl eingibt, wird das Programm beendet, da die Methoden hier nichts ausrichten können. Lassen Sie sie uns also befüllen:

+ expand sourceview plain
  1.             def View(self): 
  2.                         input=raw_input('Display all achievements? (y/n)') 
  3.                         if input.lower()=='y': 
  4.                                     entries=self.NFC.achievements 
  5.                                     for id, a in entries.iteritems(): 
  6.                                                 print "ID: ", id 
  7.                                                 for id, entry in a.iteritems(): 
  8.                                                             print id, ": ", entry 
  9.                         else: 
  10.                                     id=self.ProcessEntry('Achievement ID') 
  11.                                     entry=self.NFC.GetAchievement(id) 
  12.                                     if entry is None: 
  13.                                                 print "Achievement not found" 
  14.                                     else: 
  15.                                                 for id, e in entry.iteritems(): 
  16.                                                             print id, " : ", e 
  17.  
  18.  
  19.             def Create(self): 
  20.                         num=int(self.ProcessEntry('number of achievements')) 
  21.                         for i in range(num): 
  22.                                     desc=raw_input('Achievement description:') 
  23.                                     question=raw_input('Question:') 
  24.                                     vint=False 
  25.                                     ansint=int(self.ProcessEntry('number of answers')) 
  26.                                     answers=[] 
  27.                                     for i in range(ansint): 
  28.                                                 answer=raw_input('Enter answer '+str(i)+':') 
  29.                                                 answers.append(answer) 
  30.                                     self.NFC.AddAchievement(desc,question,answers) 

Die Methode „View“ (Prüfen) ruft entweder alle Aktivitäten ab, geht jede davon einzeln durch und zeigt dabei die verschiedenen Werte innerhalb des Verzeichnisses an, oder aber sie lässt den Benutzer eine Aktivität anhand einer ID wählen und zeigt diese an.
„Create“ (Erstellen) fordert erst eine Reihe Aktivitäten mithilfe der ProcessEntry-Methode an. Anschließend muss für jede Aktivität ein Eintrag angegeben werden, bis alle Aktivitäten erstellt worden sind.
Hier haben wir eine Beschreibung in Form einer Art Stub – diese wird üblicherweise unter der API gespeichert, aber wenn Sie sie allein nutzen, dann können Sie auch einfach die xml entsprechend anpassen und die Beschreibung hier speichern.
Weiter geht's:

+ expand sourceview plain
  1.             def Update(self): 
  2.                         id=self.ProcessEntry('Achievement ID') 
  3.                         entry=self.NFC.GetAchievement(id) 
  4.                         new_e={} 
  5.                         if entry is not None: 
  6.                                     for id in entry.keys(): 
  7.                                                 if id != "answers": 
  8.                                                             update=raw_input('Enter update for '+id+': ') 
  9.                                                             new_e[id]=update 
  10.                                                 else: 
  11.                                                             answers=[] 
  12.                                                             for a in entry["answers"]: 
  13.                                                                         u=raw_input('Enter update for answer '+a+': ') 
  14.                                                                         answers.append(u) 
  15.                                                             new_e[id]=answers 
  16.                                     self.NFC.UpdateAchievement(new_e) 
  17.                                     print "Update successful!" 
  18.                         else: 
  19.                                     print "Update failed" 
  20.                                                  
  21.             def Delete(self): 
  22.                         id=self.ProcessEntry('Achievement ID') 
  23.                         entry=self.NFC.GetAchievement(id) 
  24.                         for key, e in entry.iteritems(): 
  25.                                     print key, ":", e 
  26.                         yn=raw_input('Confirm delete? (y/n)') 
  27.                         if yn.lower()=='y' or yn.lower()=="yes": 
  28.                                     self.NFC.DeleteAchievement(id) 
  29.                         else: 
  30.                                     return None 

Dieser Abschnitt ist ziemlich selbsterklärend: Unter „Update“ (Aktualisieren) wird ein Eintrag eingegeben, nach dem gesucht werden soll. Die Methode beginnt dann mit der Suche und legt für jeden Eintrag einen neuen Eintrag an.
Wahrscheinlich könnte man auch den vorherigen Eintrag für jeden Punkt ausgeben:

+ expand sourceview plain
  1. if id != "answer": 
  2.             print "previous " +id+ ":", entry[id] 
  3.             update=raw_input('Enter update for '+id+': ') 

„Delete“ (Löschen) hat eine sehr ähnliche Funktion – die Methode ruft einen Eintrag auf, gibt ihn aus und fordert Sie dann auf, zu bestätigen, dass der Eintrag wirklich gelöscht werden soll.
Dies sind Methoden, die wie benötigen, um eine ganz grundlegende Schnittstelle zu erstellen. Für diese Datei sollten eigentlich nur sehr weniger Anpassungen erforderlich sein, da Aktualisierungen für das Laden
und Speichern von Daten von by nfc.py durchgeführt werden.
Wenn Sie die Datei jetzt schließen und ausführen, sollten Sie über ein praktisches Menü verfügen, mit dem Sie Aktivitäten nach Belieben aktualisieren und anpassen können.

image

Im nächsten Beitrag bewegen wir uns kurz weg vom Pi und gehen genauer auf das Erstellen einer einfachen Web-API mit Azure ein. Wenn Sie gerne einen anderen Dienst nutzen möchten, dann können Sie diesen Beitrag natürlich einfach überspringen. Das letzte Tutorial sollten Sie trotzdem problemlos umsetzen können.
[Pssst... wenn Ihnen das ewige Copy&Paste zu langweilig ist, dann ist dieses Github-Repository genau das Richtige für Sie. Es ist wahrscheinlich einfacher in der Anwendung, da die Einzüge in Python oft verrutschen, aber trotzdem gilt: Lesen Sie alles aufmerksam, schummeln Sie nicht und überspringen Sie keine Schritte!]

  • Sign in to reply
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2025 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube