2017-08-23 2 views
0

Je veux appeler un script python avec des paramètres de la vue django. Le script python est stocké dans un sous-dossier (voir l'image ci-jointe).Exécution du script python à partir de la vue django avec les paramètres

Fondamentalement, j'ai un formulaire d'entrée et je veux appeler crawl.py avec les données d'entrée de ce formulaire. Les données de formulaire doivent être stockées dans la variable "production_number" dans crawl.py.

view.py

from .forms import CustomerForm, LoginForm 
from .models import Orders 

from .ERPProgramm.crawl import crawlmain 

def newOrders(request): 

if request.method == 'POST': 
    form = CustomerForm(request.POST) 
    if form.is_valid(): 
     formdata = form.cleaned_data['product_ID'] 

     # call crawl.py with paramter formdata 

     return HttpResponseRedirect('/customer/newOrders') 

crawl.py

import db 
import sys 
import requests 
import json 
from datetime import datetime 

def query(resource): 
    r = requests.get('http://11.111.11.11:8080/webapp/api/v1/' + resource, 
     headers={'AuthenticationToken': '11111-11111-1111-1111-11111'} 
    ) 
    return r 


costumer_id = 1 
production_number = formdata 

d = query('productionOrder/?productionOrderNumber-eq={}'.format(production_number)).json() 

session = db.Session() 

costumer = session.query(db.Costumer).get(costumer_id) 

if 'result' in d and len(d['result']) > 0: 
    r = d['result'][0] 
    order = db.Order() 
    try: 
     order.article_id = r['articleId'] 
     order.amount = r['targetQuantity'] 
     order.create_date = datetime.fromtimestamp(r['createdDate']/1000) 
     order.start_date = datetime.fromtimestamp(r['targetStartDate']/1000) 
     order.end_date = datetime.fromtimestamp(r['targetEndDate']/1000) 
    except NameError as e: 
     sys.exit('Error {}'.format(e.what())) 

    article_number = r['articleNumber'] 
    d = query('article/?articleNumber-eq={}'.format(article_number)).json() 

    if 'result' in d and len(d['result']) > 0: 
     r = d['result'][0] 
     article_image_id = r['articleImages'][0]['id'] 
     order.price_offer = r['articlePrices'][0]['price'] 

     r = query('article/id/{}/downloadArticleImage?articleImageId={}'.format(order.article_id, article_image_id)) 

     order.article_image = r.content 
    else: 
     print('No result for article with number', article_number) 

    costumer.orders.append(order) 

    session.add(costumer) 
    session.commit() 
else: 
    print('No result for production order with article number', article_number) 

Comment puis-je appeler crawl.py de vue django?

Directory Overview

+1

Je mets peut-être votre script d'exploration en fonction, avec les paramètres d'exploration comme arguments de la fonction, puis importer le 'crawler.py 'dans votre' views.py', vous pouvez appeler la fonction crawl dans votre vue 'newOrders' si votre formulaire est valide. Si le robot d'exploration prend beaucoup de temps, il se peut qu'il soit exécuté en arrière-plan afin que l'utilisateur puisse continuer à utiliser votre application, peut-être dans RabbitMQ et céleri si c'est le cas. – RHSmith159

+0

@pap: L'exception 'NameError' n'a pas de méthode' what() '. Où trouvez-vous cela? Pourquoi attrapez-vous 'NameError'? –

+0

Votre script 'crawl.py' n'est pas fonctionnel. Pouvez-vous le réparer et le modifier? –

Répondre

0

vous pouvez check this Dans votre cas, vous devez trouver le chemin du fichier exact correspondant vous devez trouver le chemin de la base dir dans l'importation settings.py dans view.py.

settings.py

# Build paths inside the project like this: os.path.join(BASE_DIR, ...) 
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
FILE_DIR = os.path.abspath(os.path.join(BASE_DIR,'/Customer/ERPProgram') 

views.py

import sys 
sys.path.insert(0, os.path.join(settings.FILE_DIR)) 
import crawl