2013-03-17 10 views

Odpowiedz

36

Zainstalować moduł requests (dużo ładniejszy niż przy użyciu urllib2), a następnie określić trasę, która sprawia, że ​​niezbędne wniosek - coś takiego:

import requests 
from flask import Flask 
app = Flask(__name__) 

@app.route('/some-url') 
def get_data(): 
    return requests.get('http://example.com').content 

W zależności od Twojego skonfigurować choć byłoby lepiej, aby skonfigurować twój serwer internetowy, aby odwrócić proxy do witryny docelowej pod określonym adresem URL.

+0

Korzystanie wniosek urllib2 jest przyczyną błędu w mój gospodarz, zgaduję to, że żądanie instalacji zrobiłoby to samo (jeszcze nie badało się tracebacka) ... Czy nie ma wbudowanej funkcji kolby? @ Jon Clements – user1639431

+0

@ user1639431 nope - brak funkcji wbudowanej - czy flask działa pod apache2/nginx? –

+0

Nie mam pojęcia, to usługa w chmurze, ale moje pieniądze są na Nginx. W każdym razie, patrzyłem na traceback, a zarówno urllib2, jak i prośby dają "połączenie odrzucone". Nie mam problemu z otwieraniem/zwijaniem tego adresu z mojej biblioteki, nie rozumiem źródła tego problemu. @ Jon Clements – user1639431

8

Sama kolba nie ma takiej możliwości, ale prostą sprawą jest napisanie modułu obsługi żądań, który wysyła żądanie do innego serwera przy użyciu biblioteki klienta HTTP, a następnie zwraca tę odpowiedź.

# third-party HTTP client library 
import requests 

# assume that "app" below is your flask app, and that 
# "Response" is imported from flask. 

@app.route("/proxy-example") 
def proxy_example(): 
    r = requests.get("http://example.com/other-endpoint") 
    return Response(
     r.text 
     status=r.status_code, 
     content_type=r.headers['content-type'], 
    ) 

Nie osiągnie to jednak dokładnie takiego samego rezultatu, jakiego można oczekiwać od żądania po stronie klienta. Ponieważ Twój serwer nie może "zobaczyć" żadnych plików cookie przechowywanych przez przeglądarkę klienta dla witryny docelowej, Twoje zapytanie zostanie skutecznie anonimowe iw związku z tym, w zależności od witryny docelowej, może się nie powieść lub dać inną odpowiedź niż otrzymasz prośbę ten zasób w przeglądarce.

Jeśli masz związek z adresem URL firmy zewnętrznej (to znaczy, jeśli ją kontrolujesz lub potrafisz współpracować z osobami, które to robią), mogą one udostępniać żądania w domenach w przeglądarce przy użyciu adresu CORS (co jest obsługiwany tylko w nowoczesnych przeglądarkach) lub JSON-P (starsze obejście przed CORS).

Zewnętrzny dostawca może również zapewnić dostęp do danych, które chcesz uzyskać w punkcie końcowym, który jest przeznaczony do przyjmowania żądań z innych serwerów i zapewnia mechanizm uwierzytelniania aplikacji. Najpopularniejszym protokołem do tego jest OAuth.

+0

Czy próbowałeś uruchomić ten przykład w uruchomionej aplikacji Flask? Podobnie jak inne osoby próbujące wykonywać pobierania, pojawiają się błędy, takie jak "requests.exceptions.InvalidSchema: Nie znaleziono adapterów połączeń dla ..." (... == mój adres docelowy). Próbowałem kilku rodzajów adresów URL, od http://myurl.com do rzeczy takich jak http: // localhost: 5000/myurl ... ale bez żądania. Próbowałem nawet wykonać wywołanie rekursywne do trasy, aby sprawdzić, czy 'requests.get()' zadziała (i wyzwoli ponownie trasę), ale nawet adresy URL takie jak 'requests.get (" localhost: 5000/myroute ")' do nie powoduje wywołań rekursywnych. Wygląda na to, że prośby po prostu nie działają ... – JMM

0

Podobnie jak inne odpowiedzi stwierdzone przy użyciu modułu żądania dla Pythona byłoby najlepszym sposobem rozwiązania tego problemu z perspektywy kodowania. Jednak, jak wspomniano w komentarzach (i powód, dla którego doszedłem do tego pytania), może to spowodować błąd, że wniosek został odrzucony. Ten błąd jest prawdopodobnie przyczyną SELinux.

Aby sprawdzić, czy jest to problem najpierw upewnij SELinux jest włączony z tym poleceniem:

sestatus 

Jeśli „Bieżący tryb” jest „egzekwowanie” następnie SELinux jest włączony.

Następny uzyskać bieżące wartości bool, które odnoszą się bezpośrednio do apache z tym poleceniem:

getsebool -a | grep httpd 

spojrzeć na ustawienie „httpd_can_network_connect” to określa, czy apache może dokonać żądania TCP się do sieci. Jeśli jest włączony, wszystkie żądania TCP w Apache będą dozwolone. Aby włączyć go uruchomić następujące jako root:

setsebool -P httpd_can_network_connect 1 

Jeśli potrzebujesz tylko dostęp do bazy danych (miałem ten problem, przed którym właśnie podejrzewałem SELinux tutaj), to prawdopodobnie byłoby lepiej tylko włączyć „httpd_cna_network_connect” .

Celem tej zasady jest to, że jeśli haker przejął twój serwer apache, nie będzie mógł uzyskać dostępu do serwera przez resztę sieci wewnętrznej.

To prawdopodobnie byłby już lepiej jako komentarz, ale nie mam wystarczająco dużo rep ..

Źródła: https://tag1consulting.com/blog/stop-disabling-selinux https://wiki.centos.org/TipsAndTricks/SelinuxBooleans

Powiązane problemy