【问题标题】:Django project on PythonAnywhere works but no functionality, although it does locallyPythonAnywhere 上的 Django 项目工作但没有功能,虽然它在本地工作
【发布时间】:2020-12-01 04:56:32
【问题描述】:

我刚刚在 PythonAnywhere 上部署了我的第一个站点,这是一个 Craigslist 克隆,其搜索功能在本地按预期工作,但部署后我只能访问主页,然后根据我尝试的浏览器出现两个不同的错误它在。随意尝试http://matipule.eu.pythonanywhere.com/

这是 Safari https://dpaste.com/3ZAJFC4PM

这是 Chrome https://imgur.com/PjvLrao

Chrome 声称 CSRF 存在问题,但我已将令牌包含在表单中,如下所示,它实际上在本地工作,所以我一无所知。

这是令牌所在的代码。

<form action="{% url 'new_search' %}" method="post">
     {% csrf_token %}
     <input type="text" name="search" placeholder="search">
     <button class="btn waves-effect waves-light" type="submit" name="action">Submit
         <i class="material-icons right">send</i>
     </button>
 </form>

更新 使它起作用的是更新 2 中建议的公认答案。谢谢!

【问题讨论】:

    标签: python django deployment pythonanywhere


    【解决方案1】:

    一般来说,搜索请求是使用GET 方法执行的,您甚至不需要提及method="GET",因为它是默认方法。此外,您的form 中不需要csrf_token,因为它是GET 请求。

    如果您进行了这些更改,错误应该会消失,但您会收到另一个错误:

    IntegrityError at /new_search/
    NOT NULL constraint failed: my_app_search.search
    

    我不知道,但它似乎与你的数据库逻辑有关(sqlite3)

    如果你分享一些代码,我可以帮助你

    更新

    views.py

    def new_search(request):
        # search = request.POST.get('search')
        search = request.GET.get('search')  # the value should be Not NULL and the 'IntegrityError' should go.
    

    使用GET 而不是POST,因为搜索请求是通过GET 方法执行的,您将摆脱IntegrityError 错误。希望这能解决您的问题。

    更新 2

    除了上述更改之外,我在heroku 上部署了应用程序,settings.py 几乎没有变化

    ..
    ALLOWED_HOSTS = ['127.0.0.1', '.herokuapp.com']  # HERE
    ..
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }
    
    # HERE added these lines to override the default database config with postgress settings
    import dj_database_url
    db_from_env = dj_database_url.config(conn_max_age=500)
    DATABASES['default'].update(db_from_env)
    
    ..
    

    然后我运行这个命令

    heroku addons:create heroku-postgresql:hobby-dev
    
    heroku run python manage.py migrate
    

    这就是我所做的一切。

    【讨论】:

    • 哦,很高兴知道。我仍在开始我的旅程,所以我通过教程构建了这个,这就是为什么 GET 方法与 csrf_token 一起使用,对他们来说它是这样工作的,所以这就是我感到困惑的原因。该项目的所有代码都可以在这里找到github.com/MatiasPuletti/craiglist_clone
    • @MatíasPuletti 我更新了我的答案。让我知道它是否有效
    • 我已经实施了您的建议,同时删除了 csfr_token 但不幸的是,我仍然收到 CSRF 令牌丢失或不正确的错误。现在,这个错误在 Safari 和 Chrome 中都出现了。我一无所知。 PythonAnywhere 支持建议您删除令牌并通过他们的仪表板启用强制 HTTPS,但这也不起作用。
    • 这就是我现在得到的dpaste.com/6LFBTNVTH
    • 太棒了!我只需要删除它并且不指定任何GET,对吗?
    猜你喜欢
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 2016-10-29
    • 2021-05-15
    • 2017-08-19
    • 2015-08-06
    • 2020-09-06
    • 2021-06-03
    相关资源
    最近更新 更多