PDA

View Full Version : سوال: twisted



hixnal
جمعه 17 آبان 1392, 20:48 عصر
سلام خسته نباشید
ببینید دوستان من دقیقیا نمی دونم twisted چطور کار می کند (می دونم چطوری مثلا یک پروکسی سرور بسازم) ولی دیگه نمی دونم چطوره به عنوان مثال host های کاربران رو پرینت کنم یا در header ها دستکاری کنم. توابع هاشو داخل خود سایتش گرفتم ولی نمی دونم کی و کجا باید ازش استفاده کنم ؟ ایا باید در یک تایمر سریع قرار بگیره یا ؟؟؟؟ چطور مثلا از تابع getHost استفاده کنم ؟؟ باید کلاس بسازم یا کلاس رو به جایی معرفی کنم تا تابع کار کنه یا ؟؟؟

n.nowroozi
یک شنبه 19 آبان 1392, 09:18 صبح
from twisted.web import proxy, http
from twisted.internet import reactor
from twisted.python import log
import sys
log.startLogging(sys.stdout)

class ProxyFactory(http.HTTPFactory):
protocol = proxy.Proxy

reactor.listenTCP(8080, ProxyFactory())
reactor.run()



ببینید توی این مثالی که براتون گذاشته بودم شما یک factory و یک protocol دارید، شما کارهایی که میخواید با کلاینت هایی که وصل میشند انجام بدید رو باید در قسمت پروتکل مدیریت کنید همون کلاس proxy.Proxy در این مثال. حالا کاری که شما باید بکنید اینه که یک کلاس جدید تعریف کنید که از همین Proxy ارث بری کنه و بعد متدهای که مد نظرتون هست رو رونویسی کنید . حالا من کد این پروتکل رو نگاه نکردم ولی معمولا ساختار به این شکله که یک متد ConnectionMade دارند زمانی که ارتباط برقرار میشه این متد اجرا میشه شما میتونید دستوراتی که موقع برقراری ارتباط مد نظرتون هست اجرا بشند رو توی این متد قرار بدید.

hixnal
یک شنبه 19 آبان 1392, 11:36 صبح
اولا ممنونم از راهنماییتون
ثانیا :مثلا بیاید یک کلاس بسازید که host و متد و ای پی کسی که درخواست میده رو print کنید و از متد setHost بیاید host را عوض کنید ببینم به چه شکل کار می کنه
درسته وقتی که اطلاعاتی رو کاربر می فرسته تابع dataReceived()صدا زده میشه ولی تابعی مثل setHost شاید هیچ جای پروژه استفاده نشود ولی این توابعی از این قبیل کمکی هستند پس من چطوری میتونم تابع sethost را صدا بزنم

n.nowroozi
یک شنبه 19 آبان 1392, 12:19 عصر
اون بخش اول رو اگه وقت کردم نگاه میکنم انجام میدم براتون مینویسم الان یکم سرم شلوغه.
در مورد سوال دوم هم وقتی کلاینت وصل شد بهت همون setHost رو که میخوای دستی خودت فراخوانی کن. مشکلی ایجاد میشه مگه؟!

hixnal
یک شنبه 19 آبان 1392, 18:34 عصر
مشکلی نیست . یعنی امتحان نکردم.

hixnal
سه شنبه 21 آبان 1392, 19:21 عصر
سلام . ببینید متد getAllHeaders روی twisted صدا بزنید

hixnal
سه شنبه 21 آبان 1392, 23:18 عصر
مشکل من اینه که نمی تونم متد هایی که اپشنال هست مثل getHost و ... رو در همون متد dataReceived که در بالا مثال زدید صدا بزنم

n.nowroozi
شنبه 25 آبان 1392, 17:06 عصر
ببخشید دوست عزیز یکم دیر شد.
اون متدهایی که شما میخوای ازش استفاده کنی مال یک کلاس دیگه هست، شما باید از طریق اون یکی کلاس اون متد رو فراخوانی کنید دوست عزیز

hixnal
یک شنبه 26 آبان 1392, 07:08 صبح
منظورتون اینه که اگه من بخوام صداش بزنم یه error + پاسخ گویی به این تاپیک (http://barnamenevis.org/newreply.php?p=1914943&noquote=1)مثل getHost not found می ده ؟؟؟ یه همچین اروری رو نمی ده .اگه میشه یه نمونه کدی رو بگذارید ببینم به چه شکل هست

n.nowroozi
یک شنبه 26 آبان 1392, 08:16 صبح
شما کد خودت رو بزار اگه برات امکان داره در اولین فرصت سعی میکنم نگاه کنم

hixnal
یک شنبه 26 آبان 1392, 12:34 عصر
ببینید اصلا من می خواهم همون طور که پروکسی باید host ها رو از روی هدر بخونه و به اون جا وصل بشه من می خواهم بهش دستور بدم که به اون هاستی که در هدر هست وصل نشو به ای پی که من براش تعریف میکنم وصل بشه . نمی دونم این قسمت باید در reactor تنظیم بشه یا ؟؟؟

n.nowroozi
یک شنبه 26 آبان 1392, 13:00 عصر
دوست عزیز من خودم تا حالا با این ماژولش کار نکردم اما الان که نگاه کردم اینجوری به نظر میاد که پروتکلت این کلاس هست Proxy و این کلاس ریکوئستی که میاد رو میفرسته سمت کلاس ProxyRequest اونجا فکر کنم بتونی هدرهارو تغییر بدی اگه اشتباه نکنم!

hixnal
دوشنبه 27 آبان 1392, 15:17 عصر
سلام . ببینید مشکل من با این مورد حل میشه که شما بتونید در پروکسی Header رو تغییر بدید با متد setHeaser من هر چی تلاش می کنم نمی تونم. اگه میتونید نمونه کدی رو بگذارید

n.nowroozi
دوشنبه 27 آبان 1392, 15:58 عصر
عزیزه من شما فقط میگی نمیشه! اون قسمت از کدت رو که مربوط به اینه بزار ببینم چیکار کردی. اونوقت اگه کمکی از دستم بر بیاد انجام میدم.

hixnal
دوشنبه 27 آبان 1392, 17:20 عصر
from twisted.web import proxy, http
from twisted.web.http import *
from twisted.internet import reactor
print "Modules Loaded"
class HTTPProxyRequest(proxy.ProxyRequest):
def process(self):
self.setHeader("Host","Yahoo.com")
proxy.ProxyRequest.process(self)

class HTTPProxy(proxy.Proxy):
requestFactory = HTTPProxyRequest
class ProxyFactory(http.HTTPFactory):
protocol = HTTPProxy
def intercept(port):
try:
factory = ProxyFactory()
reactor.listenTCP(port, factory)
reactor.run()
except Exception as excp:
print str(excp)
intercept(1337)


ببینید باید متد setHeader کار کنه . ولی کار نمی کنه . تقریبا همه ی متد هایی که اینجا (http://twistedmatrix.com/documents/10.0.0/api/twisted.web.http.Request.html)وجود داره جواب میده ولی اونی که من می خوام جواب نمی ده .

n.nowroozi
دوشنبه 27 آبان 1392, 22:24 عصر
شیوه فراخوانیش که همینه مشکلی نداره. الان شما بعد این که set کردی خط بعدش یه getAllHeaders بگیر ببین اصلا اعمال شده یا نه؟

hixnal
سه شنبه 28 آبان 1392, 07:08 صبح
نه اعمال نشده.البته با دستور redirect هم همین مشکل بود که اعمال نمی شد ولی من بعد از دستور redirect از دستور finish استفاده کردم کار کرد ولی برای این کار نمی کنه

n.nowroozi
سه شنبه 28 آبان 1392, 08:07 صبح
من خودم اینجور مواقع یه ایمیل میزنم به تیم توسعه دهندش میپرسم

hixnal
سه شنبه 28 آبان 1392, 08:18 صبح
حالا تقریبا چیزی که می خواستم دستی درستش کردم . ولی باید کار می کرد

hixnal
سه شنبه 28 آبان 1392, 09:02 صبح
تابعی که بعد از این که اطلاعات از کلاینت می گیره dataReceived هست ولی نمی دونم تابعی که داره جواب درخواست کاربران رو از سرور می گیره چیه ؟ شما چیزی نمی دونید در این رابطه؟

n.nowroozi
سه شنبه 28 آبان 1392, 10:09 صبح
نمیدونم اما فکر کنم توی کلاس request تو قسمت finish باشه

hixnal
سه شنبه 28 آبان 1392, 11:53 صبح
هر چی میرم جلوتر بیشتر گیر میکنم . حالا با مشکلات بیشتری برخوردم . اگه وقت گذاشته بودم همون مدیریت نخ ها روی یا گرفته بودم دیگه مشکلی نداشتم.تا این که twisted رو یاد بگیرم.

hixnal
سه شنبه 28 آبان 1392, 14:43 عصر
اگه ایمیل تیم پایتون رو دارین بگذارین ممنون میشم