当前位置: 首页 > 面试题库 >

AngularJS + Django:URL刷新或直接访问未正确加载

廉高邈
2023-03-14
问题内容

我们将AngularJS嵌入到我们的Django应用程序中,URL路由由AngularJS ui-
router
处理。使用ui-
sref并在应用程序内单击可在所有部分之间进行良好的导航。

return $stateProvider.state('root.dashboard', {
        abstract: true,
        url: 'dashboard/'
      }).state('root.dashboard.profile', {
        url: 'profile/',
        views: {
          '@': {
            templateUrl: Urls['dashboard:profile'](),
            controller: 'ProfileController'
          }
        }
      }).state('root.dashboard.home', {
        url: '',
        views: {
          '@': {
            templateUrl: Urls['dashboard:dashboard_home'](),
            controller: 'DashboardController'
          }
        }
...

问题是当用户导航到非根目录页面(例如http://example.com/dashboard/profile/),并且用户刷新浏览器,重新加载浏览器的URL或直接将非根URL粘贴到浏览器中时。http://example.com/dashboard/在这种情况下,用户将被重定向到根页面(),而不是在浏览器中加载保留相同URL的页面。

由于路由是由Angular处理的,因此在服务器端,我们没有为那些非根URL定义任何url路由。相反,我们有将404重定向到根页面的中间件:

class Redirect404(object):
    def process_response(self, request, response):
        if response.status_code != 404 or request.method != 'GET':
            return response
        return HttpResponsePermanentRedirect('/dashboard')

我们希望路由器能够保留原始URL,并将用户带回原始页面(即“
dashboard/profile”)。注意,我们在Angular中设置了HTML5Mode,如下所示:

$locationProvider.html5Mode = true;

在我们的理解和/或设置中存在一些错误,请您澄清一下。


问题答案:

我们希望路由器能够维护原始URL,并将用户带回原始页面。

那是误会。

这是事件的顺序:

  1. 用户http://example.com/dashboard/profile/在位置栏中键入。
  2. 浏览器向GET服务器发送该URL 的请求。
  3. 您的服务器以301重定向响应进行响应。
  4. 浏览器会看到该响应,并向发送新GET请求http://example.com/dashboard/
  5. 服务器以您的“ Angular”页面响应。
  6. Angular应用程序启动并查看window.href以查看当前路线。它看到根路由并做出适当响应。

换句话说,当您重定向时,您将丢失原始URL。

解决方案很简单:无需重定向,只需返回页面即可响应任何(有效)URL。这样,所请求的URL就会得到维护,当Angular启动时,它将能够找出正确的路由。(这假定路由已在Angular中正确设置,但是听起来您已经可以使用了。)

实现也很简单。只需通过以下方式更改Django urls.py

urlpatterns = [
    url(r'^dashboard/$', my_view),
]

像这样:

urlpatterns = [
    url(r'^dashboard/.*$', my_view),
]


 类似资料:
  • 我正在尝试使用 NodeJS 构建 RESTful API,但在 api 调用期间无法理解使用令牌对用户进行身份验证的正确方法。在阅读了一些博客和文章后,我想出了这些方法: Access Token(AT)是包含唯一userId作为JWT有效负载的JWT令牌。1天后到期。 刷新令牌(RT)是使用uuid npm包的随机uuid。与用户文档一起存储在数据库中。 过程: 当用户登录/注册服务器发布新A

  • 本文向大家介绍oauth 刷新访问令牌,包括了oauth 刷新访问令牌的使用技巧和注意事项,需要的朋友参考一下 示例 资源

  • 若授权服务器给客户端颁发了刷新令牌,客户端通过使用按附录B“application/x-www-form-urlencoded”格式在HTTP请求实体正文中发送下列UTF-8字符编码的参数向令牌端点发起刷新请求: grant_type 必需的。值必须设置为“refresh_token”。 refresh_token 必需的。颁发给客户端的刷新令牌。 scope 可选的。如3.3节所述的访问请求的范

  • 问题内容: 我正在使用Java进行项目,因此需要在单击特定按钮后重新加载整个程序。这该怎么做? 问题答案: 尝试 如果仍然无法使用,请在完成上述步骤后尝试

  • 我希望能够访问我的“根”属性或子集。所以我尝试这样做: 根属性 SdkProperties 因此,通过这种方式,我可以自动连接完整的,或者只自动连接类,具体取决于我需要为给定上下文访问什么。 然而,当我以这种方式配置它时,我会从Spring得到一个堆栈溢出: 如何支持此工作流?

  • 我应该有一个正常的贴图如下: 但当我加载场景时,或者从inspector中的另一个场景切换(例如,单击“场景/菜单”,然后单击此场景),或者在游戏中转移到此场景(),精灵会随机不可见。 每次都有一些精灵隐形,下一次隐形的可能就不一样了。我怀疑这是Unity编辑器的问题,因为即使我不在播放模式下也会发生这种情况。 在中,我肯定会找到这些sprite(不是null)。他们就是不出现。我必须重新加载精灵