使用flask、python和sqlite从另一个函数或路由调用一个函数
我正在使用flask、python和sqlite进行cs50最终项目。我的问题是理解如何从同一个路由调用两个函数,或者从另一个路由调用一个函数。或者坦率地说,如何实现以下目标:1-根据日期和月份分配星号;2-更新sqlite数据库(signs.db),将星号显示在index.html上。我试图使用这个示例代码,但无法使zodiac函数正常工作。我曾尝试在寄存器路由中不使用函数if/elif语句来执行此操作,但我得到了“NameError:name'astro_sign'未定义”或“UnboundLocalError:local变量'astro_sign'在赋值前引用”这两个选项,具体取决于尝试。我在这里找到了一个关于局部变量和全局变量的例子,并建议添加“astro=”,但随后my signs.db会更新为空字符串,就好像函数从未运行一样。我还尝试使用@/黄道带路线进行重定向,但无法正确执行。我发现了这个:但别明白。在下面的当前尝试中,我尝试将该函数放入helper.py,但这完全扼杀了应用程序。我不知道如何返回函数,如何全局命名变量,我非常沮丧。我从html文档中提取月份和日期作为整数: register.html:使用flask、python和sqlite从另一个函数或路由调用一个函数,python,flask,Python,Flask,我正在使用flask、python和sqlite进行cs50最终项目。我的问题是理解如何从同一个路由调用两个函数,或者从另一个路由调用一个函数。或者坦率地说,如何实现以下目标:1-根据日期和月份分配星号;2-更新sqlite数据库(signs.db),将星号显示在index.html上。我试图使用这个示例代码,但无法使zodiac函数正常工作。我曾尝试在寄存器路由中不使用函数if/elif语句来执行此操作,但我得到了“NameError:name'astro_sign'未定义”或“Unbound
<form action="/register" method="post">
<div class="form-group">
<input autocomplete="off" autofocus class="form-control" name="username" placeholder="Username" type="text">
</div>
<div class="form-group">
<select class="form-control" name="month">
<option value= 1>January</option>
<option value= 2>February</option>
<option value= 3>March</option>
<option value= 4>April</option>
<option value= 5>May</option>
<option value= 6>June</option>
<option value= 7>July</option>
<option value= 8>August</option>
<option value= 9>September</option>
<option value= 10>October</option>
<option value= 11>November</option>
<option value= 12>December</option>
</select>
</div>
<div class="form-group">
<input class="form-control" name="day" placeholder="Day of Birth" type="number">
</div>
<div class="form-group">
<input class="form-control" name="password" placeholder="Password" type="password">
</div>
<div class="form-group">
<input class="form-control" name="confirmation" placeholder="Confirm Password" type="password">
</div>
<button class="btn btn-primary" type="submit">Register</button>
</form>
在helper.py中,我的最新尝试现在导致应用程序在注册后完全崩溃
def zodiac_sign(day, month):
astro_sign = ''
# checks month and date within the valid range
# of a specified zodiac
if month is 12:
astro_sign = 'Sagittarius' if (day < 22) else 'capricorn'
elif month is 1:
astro_sign = 'Capricorn' if (day < 20) else 'aquarius'
elif month is 2:
astro_sign = 'Aquarius' if (day < 19) else 'pisces'
elif month is 3:
astro_sign = 'Pisces' if (day < 21) else 'aries'
#you get the point
elif month is 11:
astro_sign = 'scorpio' if (day < 22) else 'sagittarius'
return astro_sign
很难给出完整的答案,因为代码目前有些不完整,但我认为您在注册时看到一个空白屏幕的原因是您的
register
函数中的if语句:
如果天文符号为“”:
黄道十二宫(日、月)
返回天文星座
让我们想想在代码的这一点上发生了什么:在寄存器
函数的顶部,我们有一行astro_符号=''
,在我们到达这一点之前,我们不会改变这个astro_符号
变量,所以这个if条件(astro_符号是'
)将始终计算为true,因此,将始终调用其中的代码
接下来,我们运行zodiac\u sign
函数,这是有意义的,因为我们需要找到星座以将其包含在输出中。该函数返回一个字符串。但是,在register
函数中,不会将字符串的结果存储在astro\u sign
变量中。我知道zodiac\u sign
函数调用它构造的字符串变量astro\u sign
,但由于这是两个不同的函数,这不会影响寄存器
函数中的astro\u sign
,它将保留为'
(空字符串)
然后,我们返回星号。但这意味着寄存器的其余部分将无法运行!我们返回空字符串astro符号,因此Flask会向浏览器发送一个空页面。我们真正想做的是改变register
函数中的astro\u sign
变量,以便稍后将其插入数据库。因此,也许您应该将if语句更改为如下内容:
如果天文符号为“”:
天象星座=黄道十二宫(日、月)
现在,函数应该在if语句运行之后继续运行,我们最终将返回login.html
模板
编辑:此外,您可能需要更新zodiac\u sign
函数,使其正确缩进,如下所示:
def十二生肖(日、月):
天文符号=“”
#检查有效范围内的月份和日期
#黄道带的
如果月份为12:
天文学星座=‘射手座’如果(第22天)其他星座是‘摩羯座’
elif月份为1:
天文学星座=‘摩羯座’如果(第20天)其他星座是‘水瓶座’
elif月份为2:
天文学星座=‘水瓶座’如果(第19天)其他星座是‘双鱼座’
elif月为3:
天蝎座=‘双鱼座’如果(第21天)其他星座是‘白羊座’
#你明白了
elif月为11:
天蝎座=天蝎座如果(第22天)其他星座是射手座
返回天文星座
如果有人遇到这个问题,它最终会成为一个铸造问题。在index.html上,几个月来我一直在使用“数字”,但python将它们读取为字符串(“12”)。我用
解决了这个错误。我也可以在helpers.py中的所有月份数字周围加上“”,使它们成为字符串@ouroboring帮助我了解了实际功能,但我太新了,不能投票。谢谢大家! 我认为这个问题需要澄清一下:当你说你当前的代码“完全杀死了应用程序”时,你看到的实际错误是什么?这真的可以帮助我们了解出了什么问题。此外,缩进看起来有点不对劲:我假设zodiac\u sign
函数的内容是要缩进的,但如果不是,那肯定会导致问题。您是否正在从application.py
中的helper
模块导入zodiac\u sign
功能?很抱歉。我很沮丧。在尝试注册新用户后,我当前使用helper.py中函数的代码会导致屏幕完全变白(没有恢复)。在任何情况下,我都无法在signs.db中更新astro_符号。我忘了说我正在将zodiac函数导入application.py。是的,我是。至少感谢您的回复。我是新来堆叠和尝试的。我正在使用cs50 IDE。我没有收到错误,但我想我正在尝试从helpers.py中的zodiac函数重定向到路由索引。我尝试了很多东西,可能是复制了错误的版本。对不起,如果是这样的话,在my helpers.py zodiac函数的底部有一个return redirect(“/”)。不管怎样,我都需要帮助。我可以提供您需要的任何代码来查看导入的内容。我希望我不是一个虚拟的学生,因为我想真正理解这一点。艾特
def zodiac_sign(day, month):
astro_sign = ''
# checks month and date within the valid range
# of a specified zodiac
if month is 12:
astro_sign = 'Sagittarius' if (day < 22) else 'capricorn'
elif month is 1:
astro_sign = 'Capricorn' if (day < 20) else 'aquarius'
elif month is 2:
astro_sign = 'Aquarius' if (day < 19) else 'pisces'
elif month is 3:
astro_sign = 'Pisces' if (day < 21) else 'aries'
#you get the point
elif month is 11:
astro_sign = 'scorpio' if (day < 22) else 'sagittarius'
return astro_sign
Any help would be so appreciated!