render和redirect_to

       简略的说,redirect_to是执行页面的跳转,发送请求重定向页面,执行对应的action,重新加载服务器数据,不保留页面原有数据;

       render是简单的页面渲染,可以指定渲染页面和布局文件,不会发送请求,不会执行action函数,不会重新加载服务器数据。

       

这里举个例子说明一下:

 

users_controller.rb:

def create_login_session
  user = User.find_by_name(params[:name])
  if user && user.authenticate(params[:password])
    cookies.permanent[:token] = user.token
    redirect_to :admin_welcome
  else
    flash[:error] = "用户名不存在或密码错误"
    redirect_to :login
  end
end

 

login.html.rb:

<div class="center-block" id="login">
  <h3>登录</h3>
  <div class="">
    <%= form_tag "/create_login_session" do %>
      <dl class="input-group">
         <dt class="input-group-addon">
            <%= label_tag "帐号" %>
         </dt>
         <dd class = "">
            <%= text_field_tag :name, params[:name], :class => "form-control" %>
         </dd>
      </dl>
      <dl class="input-group">
         <dt class="input-group-addon">
           <%= label_tag "密码" %>
         </dt>
         <dd class = "">
           <%= password_field_tag :password, params[:password], :class => "form-control" %>
         </dd>
      </dl>
      <% if flash[:error] %>
          <div class = "alert alert-danger">
             <%= flash[:error] %>
          </div>
      <% end %>
      <p> <%= submit_tag "登录", :class => "btn-default btn btm-primary" %> </p>
    <% end %>
  </div>
</div>

 

      当在登录页面输入帐号密码后点击登录,如果帐号密码不匹配,这时调用create_login_session方法就会显示flash的错误到页面,而输入的帐号和密码将会被清空,因为redirect_to重新发送了请求,重新加载了登录页面,重新获取了服务器的数据。如果这是点击浏览器的刷新按钮,也就相当于重新再执行了一次redirect_to,这时flash的内容在登录页面上也会消失,因为flash的内容缓存已经清空了。

     

       如果将redirect_to改为render:

render :login

     

       这时登录输入不正确点击登录,输入的帐号和密码的内容将还会在页面上显示,显示flash的错误到页面,此时刷新相当于render,内容一直存在页面,因为render不会发送请求,不会重新加载服务器数据,它只是渲染了页面。

 

接下来通过另一个例子深入了解一下render和redirect_to:

 

test_controller.rb:

def test1
   puts "test1_one"
   render :test1
   puts "test_wo"
end

def test2
   puts "test2_one"
   redirect_to :test2
   puts "test2_two"
end

在对应的views文件夹下有test1.html.rb和test2.html.rb

在浏览器中,test1页面显示:

test1_one

test1_two

 

test2页面会显示:

test2_one

test2_two

test2_one

test2_two

........

 

       这里总结一这个例子,在执行render或redirect_to前,def中的所有代码都会按照顺序执行一遍,比如test1页面显示了test1_two;render是渲染页面,不会发送请求,不会重新加载服务器的数据;而redirect_to是跳转到一个页面,而例子会一直循环跳转到当前页面,加载数据,导致死循环。

### 如何在 Flask 中设置路由重定向 在 Flask 应用程序中,`@app.route()` 是用于定义 URL 路由的核心装饰器。通过此装饰器可以指定不同的路径及其对应的视图函数[^1]。当涉及到重定向时,可以通过 `redirect_to` 参数者使用 `flask.redirect()` 函数来实现。 以下是完整的示例代码,展示如何创建一个带有主要 HTML 模板的 Flask 应用,并配置基本路由重定向功能: #### 主要代码结构 ```python from flask import Flask, render_template, redirect, url_for # 初始化应用实例 app = Flask(__name__) @app.route('/') def index(): """ 定义根目录 '/' 的默认行为 """ return render_template('main.html') @app.route('/admin') def admin(): """ 原始 '/admin' 页面逻辑 """ return '这是原始管理员页面' @app.route('/redirected_admin') def redirected_admin(): """ 新的目标页面逻辑 """ return '这是被重定向后的管理员页面' @app.route('/go_to_redirect', redirect_to='/redirected_admin') def go_to_redirect(): """ 使用内置方式直接跳转到新地址 """ pass # 此处无需额外操作 @app.route('/manual_redirect') def manual_redirect(): """ 手动执行重定向至目标页面 """ return redirect(url_for('redirected_admin')) if __name__ == '__main__': app.run(debug=True) ``` #### 配置 HTML 模板 (templates/main.html) 为了提供更友好的用户体验,通常会设计一个简单的 HTML 文件作为主页模板。下面是一个基础的例子: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Flask Example</title> </head> <body> <h1>欢迎来到 Flask 示例项目</h1> <p><a href="{{ url_for('admin') }}">访问管理员页面</a></p> <p><a href="{{ url_for('go_to_redirect') }}">自动重定向到新的管理员页面</a></p> <p><a href="{{ url_for('manual_redirect') }}">手动触发重定向</a></p> </body> </html> ``` 上述代码展示了两种类型的重定向机制:一种是利用 `@app.route(..., redirect_to=...)` 自动完成;另一种则是调用 `flask.redirect()` 方法显式控制流程。 --- ### 关于 Web 表单集成 如果希望进一步增强应用程序的功能,比如加入用户输入验证,则可引入 Flask-WTF 扩展[^2]。这不仅简化了表单管理过程,还提供了 CSRF 保护等功能支持。 例如,在现有基础上增加登录表单处理能力: ```python from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired class LoginForm(FlaskForm): username = StringField('用户名', validators=[DataRequired()]) password = PasswordField('密码', validators=[DataRequired()]) submit = SubmitField('登录') @app.route('/login', methods=['GET', 'POST']) def login(): form = LoginForm() if form.validate_on_submit(): return f"成功登录! 用户名: {form.username.data}" return render_template('login.html', form=form) ``` 对应 HTML 登录界面 (`templates/login.html`) 可如下编写: ```html <form method="post"> {{ form.hidden_tag() }} <p>{{ form.username.label }}<br>{{ form.username(size=30) }}</p> <p>{{ form.password.label }}<br>{{ form.password(size=30) }}</p> <p>{{ form.submit() }}</p> </form> ``` 以上片段实现了基于 Flask-WTF 构建的安全认证入口。 --- ### 单点登录(Single Sign-On)扩展说明 对于某些场景下需要统一身份验证服务的情况,可以考虑采用 CAS(Central Authentication Service)。该插件允许开发者轻松添加 `/login/` `/logout/` 接口的支持[^3]。具体实现细节取决于所选库版本及文档指导。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值