#1 by Rita
Hello,everyone,I want to do a market experiment using oTree, where buyers and sellers are paired to make decisions about the quality and price of goods and whether to purchase them. But i meet this problem and my codes are as follows. I will appreciate it if someone can help me.
Exception in ASGI application
Traceback (most recent call last):
File "D:\Python\python3.11.3\Lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 396, in run_asgi
result = await app(self.scope, self.receive, self.send)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\Python\python3.11.3\Lib\site-packages\uvicorn\middleware\proxy_headers.py", line 45, in __call__
return await self.app(scope, receive, send)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\Python\python3.11.3\Lib\site-packages\starlette\applications.py", line 112, in __call__
await self.middleware_stack(scope, receive, send)
File "D:\Python\python3.11.3\Lib\site-packages\starlette\middleware\base.py", line 26, in __call__
await response(scope, receive, send)
File "D:\Python\python3.11.3\Lib\site-packages\starlette\responses.py", line 224, in __call__
await run_until_first_complete(
File "D:\Python\python3.11.3\Lib\site-packages\starlette\concurrency.py", line 24, in run_until_first_complete
[task.result() for task in done]
File "D:\Python\python3.11.3\Lib\site-packages\starlette\concurrency.py", line 24, in <listcomp>
[task.result() for task in done]
^^^^^^^^^^^^^
File "D:\Python\python3.11.3\Lib\site-packages\starlette\responses.py", line 216, in stream_response
async for chunk in self.body_iterator:
File "D:\Python\python3.11.3\Lib\site-packages\starlette\middleware\base.py", line 56, in body_stream
task.result()
File "D:\Python\python3.11.3\Lib\site-packages\starlette\middleware\base.py", line 38, in coro
await self.app(scope, receive, send)
File "D:\Python\python3.11.3\Lib\site-packages\otree\errorpage.py", line 247, in __call__
raise exc # from None
^^^^^^^^^
File "D:\Python\python3.11.3\Lib\site-packages\otree\errorpage.py", line 227, in __call__
await self.app(scope, receive, _send)
File "D:\Python\python3.11.3\Lib\site-packages\starlette\middleware\base.py", line 25, in __call__
response = await self.dispatch_func(request, self.call_next)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\Python\python3.11.3\Lib\site-packages\otree\middleware.py", line 42, in dispatch
response = await call_next(request)
^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\Python\python3.11.3\Lib\site-packages\starlette\middleware\base.py", line 45, in call_next
task.result()
File "D:\Python\python3.11.3\Lib\site-packages\starlette\middleware\base.py", line 38, in coro
await self.app(scope, receive, send)
File "D:\Python\python3.11.3\Lib\site-packages\starlette\middleware\sessions.py", line 75, in __call__
await self.app(scope, receive, send_wrapper)
File "D:\Python\python3.11.3\Lib\site-packages\otree\patch.py", line 41, in __call__
raise exc # from None
^^^^^^^^^
File "D:\Python\python3.11.3\Lib\site-packages\otree\patch.py", line 29, in __call__
await self.app(scope, receive, sender)
File "D:\Python\python3.11.3\Lib\site-packages\starlette\routing.py", line 582, in __call__
await route.handle(scope, receive, send)
File "D:\Python\python3.11.3\Lib\site-packages\starlette\routing.py", line 243, in handle
await self.app(scope, receive, send)
File "D:\Python\python3.11.3\Lib\site-packages\otree\views\abstract.py", line 118, in dispatch
response = await run_in_threadpool(self.inner_dispatch, request)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\Python\python3.11.3\Lib\site-packages\starlette\concurrency.py", line 40, in run_in_threadpool
return await loop.run_in_executor(None, func, *args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\Python\python3.11.3\Lib\site-packages\otree\database.py", line 586, in __getattribute__
res = super().__getattribute__(attr)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'Player' object has no attribute 'player'
from otree.api import *
from django.db import models as djmodels
# 定义实验的常量
class Constants(BaseConstants):
name_in_url = 'market_experiment'
players_per_group = None
num_rounds = 1
num_buyers = 10
num_sellers = 10
# 定义子实验
class Subsession(BaseSubsession):
def creating_session(self):
# 确保有足够的玩家来形成买家和卖家的配对
players = self.get_players()
if len(players) < Constants.num_buyers + Constants.num_sellers:
raise ValueError("Not enough players to form buyer and seller pairs.")
# 将玩家分为卖家和买家
sellers = [p for p in players if 'F' in p.player_role]
buyers = [p for p in players if 'C' in p.player_role]
# 为每个卖家和买家分配配对
for i in range(min(len(sellers), len(buyers))):
seller = sellers[i]
buyer = buyers[i]
seller.partner_id = buyer.id
buyer.partner_id = seller.id
print(f"Seller {seller.id_in_group} role: {seller.player_role}, partner: {buyer.id_in_group}")
print(f"Buyer {buyer.id_in_group} role: {buyer.player_role}, partner: {seller.id_in_group}")
# 定义组
class Group(BaseGroup):
pass
# 定义玩家模型
class Player(BasePlayer):
# 玩家属性
player_role = models.StringField()
partner_id = models.IntegerField(null=True)
quality = models.IntegerField(
label="商品的品质:",
min=0, max=100
)
price = models.CurrencyField(
label="商品的价格:",
min=0
)
purchase_decision = models.BooleanField(
label="你是否购买这个商品?",
choices=[
[True, '是'],
[False, '否']
],
widget=widgets.RadioSelect
)
# 定义一个属性来获取玩家的配对
@property
def partner(self):
if self.partner_id:
return self.subsession.get_player_by_id(self.partner_id)
return None
# 定义介绍页面
class Introduction(Page):
def vars_for_template(self):
player = self.player
partner = player.partner
if partner:
print(
f"Introduction Page - Player {player.id_in_group} role: {player.player_role}, partner: {partner.id_in_group}")
else:
print(f"Introduction Page - Player {player.id_in_group} role: {player.player_role}, no partner")
return {
'player_role': player.player_role,
'partner_role': partner.player_role if partner else None,
}
# 定义卖家决策页面
class SellerDecision(Page):
form_model = 'player'
form_fields = ['quality', 'price']
def is_displayed(self):
return 'F' in self.player.player_role
def vars_for_template(self):
player = self.player
partner = player.partner
if partner:
print(
f"SellerDecision Page - Player {player.id_in_group} role: {player.player_role}, partner: {partner.id_in_group}")
else:
print(f"SellerDecision Page - Player {player.id_in_group} role: {player.player_role}, no partner")
return {
'player_role': player.player_role,
'partner_role': partner.player_role if partner else None,
}
# 定义买家视图页面
class BuyerView(Page):
def is_displayed(self):
return 'C' in self.player.player_role
def vars_for_template(self):
player = self.player
partner = player.partner
if partner:
print(
f"BuyerView Page - Player {player.id_in_group} role: {player.player_role}, partner: {partner.id_in_group}")
else:
print(f"BuyerView Page - Player {player.id_in_group} role: {player.player_role}, no partner")
return {
'seller_quality': partner.quality if partner else None,
'seller_price': partner.price if partner else None,
'seller_role': partner.player_role if partner else None,
}
# 定义买家决策页面
class BuyerDecision(Page):
form_model = 'player'
form_fields = ['purchase_decision']
def is_displayed(self):
return 'C' in self.player.player_role
def vars_for_template(self):
player = self.player
partner = player.partner
if partner:
print(
f"BuyerDecision Page - Player {player.id_in_group} role: {player.player_role}, partner: {partner.id_in_group}")
else:
print(f"BuyerDecision Page - Player {player.id_in_group} role: {player.player_role}, no partner")
return {
'seller_quality': partner.quality if partner else None,
'seller_price': partner.price if partner else None,
'seller_role': partner.player_role if partner else None,
}
# 定义结果等待页面
class ResultsWaitPage(WaitPage):
def after_all_players_arrive(self):
pass
# 定义结果页面
class Results(Page):
def vars_for_template(self):
player = self.player
partner = player.partner
if partner:
print(
f"Results Page - Player {player.id_in_group} role: {player.player_role}, partner: {partner.id_in_group}")
else:
print(f"Results Page - Player {player.id_in_group} role: {player.player_role}, no partner")
return {
'role': player.player_role,
'partner_role': partner.player_role if partner else None,
'partner_purchase_decision': partner.purchase_decision if partner else None,
}
# 定义页面顺序
page_sequence = [Introduction, SellerDecision, BuyerView, BuyerDecision, ResultsWaitPage, Results]