Zwei Funktionen der selben URL übergeben

Django, Flask, Bottle, WSGI, CGI…
Benutzeravatar
__blackjack__
User
Beiträge: 1407
Registriert: Samstag 2. Juni 2018, 10:21

Donnerstag 8. November 2018, 15:10

@Prinz_Monty: Du übergibst gar keine Funktionen an URLs, Du hast eine Abbildung von URLs auf Funktionen, mit einer Funktion pro URL. Und in dieser einen Funktion musst Du dann alles machen was am Ende nötig ist um die Antwort für den Aufruf der URL zusammenzustellen. Wobei in der Funktion etwas machen auch das aufrufen von anderen Funktionen beinhalten kann, die dann Teilaufgaben lösen. Das heisst in dieser einen Funktion kannst Du die Funktionen A, B, C, und D aufrufen und aus deren Rückgabewerten Dein Ergebnis für die URL zusammensetzen. Also ganz normal wie man auch ohne Django programmieren würde. Durch Django ändert sich an dieser üblichen Vorgehensweise nichts.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
sagro
User
Beiträge: 1
Registriert: Freitag 19. Oktober 2018, 20:50

Donnerstag 8. November 2018, 19:03

Hallo,

es würde die Sache vereinfachen, wenn du dein Problem konkretisieren würdest. Also, was machen diese zwei Views konkret, dass Sie auf eine URL aufgelöst werden sollen? Ist es eine App für Kochrezepte? Ich denke, wenn du das ein wenig genauer ausführst, kann man eventuell das Problem anderweitig lösen ;O)

Grüße
sagro
Benutzeravatar
Prinz_Monty
User
Beiträge: 18
Registriert: Mittwoch 24. Oktober 2018, 09:43

Sonntag 11. November 2018, 17:05

sagro hat geschrieben:
Donnerstag 8. November 2018, 19:03
Hallo,

es würde die Sache vereinfachen, wenn du dein Problem konkretisieren würdest. Also, was machen diese zwei Views konkret, dass Sie auf eine URL aufgelöst werden sollen? Ist es eine App für Kochrezepte? Ich denke, wenn du das ein wenig genauer ausführst, kann man eventuell das Problem anderweitig lösen ;O)

Grüße
sagro
Also ich habe eine Funktion die bekommt Daten von einer API aus einer Domain Verwaltung ( ISPConfig ). Das funktioniert nun auch ganz toll, auch dank dieses Forums hier.
Ich möchte eine App bauen welche mir ermöglicht mit den Daten von der API eine Übersicht der Domains und deren Abrechnungszeiträume darzustellen.

Also ich möchte:

1. Alle Aktiven und Deaktivierten Domains anzeigen
2. Alle Domains zu einem bestimmten Kunden
3. Sortierung nach Rechnungsdatum (Alle 12 Monate) oder nach Kunden
4. Detailansicht zu jeder Domain mit einem Formular welches mir ermöglicht Notizen zu jeder Domain anzulegen (Das Notiz Feld ist ein teil von ISPConfig also benötige ich dafür keine Datenbank)
5. Möchte ich einen Status setzen können Domain Abgerechnet am: , Domain bezahlt am: , Mahnung 1 am: , Mahnung 2 am: , Das ganze soll in der Übersicht aller Domains farbig Dargestellt werden was ich vermutlich über Bootstrap machen werde.
6. Später vielleicht noch einen Userlogin. Dazu gibts ja aber auch genug Anleitungen.

Jetzt mein IST Zustand:

Ich habe eine Klasse die mit der API kommuniziert:

Code: Alles auswählen

import requests
import logging
logger = logging.getLogger("ispconfig")

BASE_URL = 'https://127.0.0.1/remote/json.php'


class ISPConfig:
    def __init__(self, base_url):
        self.base_url = base_url
        self.session_id = None

    # Session ID capsle
    def _call(self, command, **params):
        if self.session_id:
            params['session_id'] = self.session_id
        response = requests.post(self.base_url, params=command, json=params).json()
        if response['code'] != 'ok':
            raise RuntimeError(f'Fehler bei {command}: {response["message"]}')
        return response['response']

    # Login send
    def login(self, username, password):
        self.session_id = None
        self.session_id = self._call('login', username=username, password=password)
        logger.info('Erfolgreich angemeldet: %s', self.session_id)

    # Get a domain by id
    def sites_web_domain_get(self, primary_id):
        return self._call('sites_web_domain_get', primary_id=primary_id)

    # Get all active = 'y' or none active domains 'n'
    def sites_web_domain_get_all(self, active):
        return self._call('sites_web_domain_get', primary_id={'active': active})

    # Get client by id (9=Merker)
    def client_get(self, client_id):
        return self._call('client_get', client_id=client_id)

    # Get all API functions '1'
    def get_function_list(self, function_list):
        return self._call('get_function_list', primary_id=function_list)

    def domains_get_all_by_user(self, group_id):
        return self._call('domains_get_all_by_user', group_id=group_id)

    # Add notice to clients
    def client_update(self, client_id, affected_row):
        return self._call('client_update', client_id=client_id, params={'notes': affected_row})

    # Get all domains by single user with groupid
    def client_get_sites_by_user(self, sys_groupid):
        return self._call('client_get_sites_by_user', sys_groupid=sys_groupid)
        
Zwei Funktionen eine für die Connection zur API und eine die mir bis jetzt alle Domains liefert nach Status Aktiviert oder Deaktiviert oder alle Domains von einem User über die die UserId (sys_groupid):

Code: Alles auswählen

from django.shortcuts import render
from domain_cm.ispconfig import ISPConfig


def index(request):
    return render(request, 'domain_cm/index.html')


def connection_api():
    base_url = 'https://127.0.0.1/remote/json.php'
    isp_config = ISPConfig(base_url)
    isp_config.login("USER", "PASSWORD")

    return isp_config


def domains_by_status(request):
    domains_active = connection_api().sites_web_domain_get_all("y")
    domains_disable = connection_api().sites_web_domain_get_all("n")
    domains_by_user = connection_api().client_get_sites_by_user("2")

    return render(request, 'domain_cm/domains.html', {'domains_active': domains_active,
                                                      'domains_disable': domains_disable,
                                                      'domains_by_user': domains_by_user,
                                                      })
urls.py:

Code: Alles auswählen

from django.urls import path
from . import views

app_name = 'domains'
urlpatterns = [
    path('', views.index, name='index'),
    path('domains/', views.domains_by_status, name='domains'),
]
Das ganze gebe ich mir erstmal nur mit paar for schleifen im Template aus:

Code: Alles auswählen

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Domains</title>
</head>
<body>
    <p>Aktiviert:</p>
    {% for domain_active in domains_active %}
        <p>ID: {{ domain_active.domain_id }} Domain: {{ domain_active.name }} Added: {{ domain_active.added_date }}</p>
    {% endfor %}
    <p>Deaktiviert:</p>
    {% for domain_disable in domains_disable %}
        <p>ID: {{ domain_disable.domain_id }} Domain: {{ domain_disable.name }} Added: {{ domain_disable.added_date }}</p>
    {% endfor %}
    <p>Domains von User:</p>
    {% for domain_by_user in domains_by_user %}
        <p>{{ domain_by_user }}</p>
    {% endfor %}

</body>
</html>
Hier stehe ich gerade vor einer neuen Aufgabe wie ich per POST zb. den Status == "y" übergebe? Will das ja nicht von der Funktion aus machen sondern zb. Per Dropdown Menü auswählen können. Also muss ich ja den Status per form Formular an den Code übergeben.

Zu meiner eigentlichen frage wie ich verschiedene Dinge auf einer Seite anzeige ist mir nun langsam klarer das ich dies in einer Funktion oder Klasse lösen sollte. Einiges lässt sich ja auch schon durch die Template Engine realisieren also muss ich ja nicht alles in einer Funktion darstellen. Zb. Sortierungen etc.

So das ist nun alles was ich habe und wo ich am Ende hin möchte.
Mögen hätt ich schon wollen, aber dürfen habe ich mich nicht getraut. *Karl Valentin
Sirius3
User
Beiträge: 8579
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 11. November 2018, 18:04

connection_api sollte man maximal einmal pro Request aufrufen, Du rufst ja jetzt grad ständig überflüssigerweise login auf. url, user und password sollte in einer Konfigurationsdatei stehen, z.B. settings.py wo schon viel anderes Zeug steht.
Antworten