使用flask、python和sqlite从另一个函数或路由调用一个函数

使用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

我正在使用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:

    <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!