【问题标题】:How to pass an object between views in django?如何在 django 的视图之间传递对象?
【发布时间】:2020-01-19 03:07:27
【问题描述】:

背景故事/问题

我有一个运行各种作业的 Web 应用程序。其中一项工作包括运行登录到linkedin的python脚本。

当我运行脚本时,一个无头铬实例启动,导航到linkedin登录页面并提交正确的凭据。到目前为止一切正常,但有时linkedin会将我的请求发送到检查点网址并提示我提交发送到我的电子邮件的特殊密码,然后才能继续。

在我看来,我无法理解如何实现这种条件逻辑; 基本上,我想有一种方法可以在我的网络应用程序中输入密码。

预期结果

从django视图运行脚本登录linkedin,如果到达checkpoint提示用户输入pincode,否则如果没有到达checkpoint并且登录成功则继续。

我尝试过的

  • Google - 找不到任何特定于我的问题的内容。

  • 下面的代码 - 下面的视图显示了我当前的尝试。我知道可以做到,但我不确定是否应该尝试在单个视图中构建它,或者是否应该尝试将我的 chromium 实例传递给另一个视图(对象不可序列化,所以我不确定我该怎么做;也许我可以将 chromium id 传递给我的 webdriver 的另一个实例,但我认为这不是最好的方法?)

  • 阿贾克斯? - 我实际上没有尝试过,但我知道这是一个选择。

备注**

我在下面包含的代码就是一切。但唯一需要考虑的重要部分是视图,我认为添加其余部分可能会澄清逻辑并帮助某人帮助我。希望这不是太冗长!

查看

def verify_linkedin(request):
    """Used for verifying login to linkedin with email pincode"""
    ln = LinkedinScraper()
    if ln.login_to_linkedin(username=os.getenv("LINKEDIN_USERNAME"), password=os.getenv("LINKEDIN_PASSWORD")):
        return HttpResponse("<h1>You are verified</h1>")
    else:
        if request.method == "POST":
            form = VerifyLinkedinForm(request.POST)
            if form.is_valid():
                print(form.cleaned_data)
                pin_code = form['verification_key']
                ln.authenticate_linkedin_login(pin_code)
                return redirect("home")
        else:
            form = VerifyLinkedinForm()

    context = {"form": form}
    return render(request, "linkedin_verify.html", context)

表格

class VerifyLinkedinForm(forms.Form):
    verification_key = forms.CharField()
    helper = FormHelper()
    helper.form_method = "post"
    helper.layout = Layout(
        'verification_key',
        FormActions(
            Submit("submit", "Verify Linkedin", style="display: block; margin: auto; margin-bottom:2em;",
                css_class="btn btn-success", ),
        )
    )

模板

{% extends 'base.html' %}
{% load crispy_forms_tags %}

{% block content %}
  {% crispy form %}
{% endblock %}

网络爬虫后端

class LinkedinScraper(WebScraper):
    """Class for logging into linkedin with chromedriver and scraping linkedin"""

    def __init__(self, headless=True, **kwargs):
        super(LinkedinScraper, self).__init__()
        self.setup_driver(headless=headless)
        self.data = {}
        self.pause = 10
        self.retries = 0
        self.max_retries = 3

    def login_to_linkedin(self, username: str, password: str) -> bool:
        """ Navigates to Linkedin login page and logs in with credentials"""
        login_url = "https://www.linkedin.com/login"
        self.driver.get(login_url)
        user_element = self.driver.find_element("id", "username")
        pass_element = self.driver.find_element("id", "password")
        login_btn = self.driver.find_element_by_class_name(
            "login__form_action_container"
        )
        self.login_and_authenticate(login_btn, user_element, pass_element, username, password)
        if 'checkpoint' in self.driver.current_url:
            return False
        else:
            return True

    def authenticate_linkedin_login(self, pin_code: str):
        """ Sometimes when logging into linkedin from a new ip address, linkedin will flag account for suscipicous access
        If this happens we need to use a pin code sent to email and input it into the form.

        This should be immedidately called after login_and_authenticate returns False
        """
        if 'checkpoint' in self.driver.current_url:
            verification_element = self.driver.find_element_by_xpath("//input[@id='input__email_verification_pin']")
            print(pin_code)
            self.random_send_keys(element=verification_element, keys=pin_code)
            submit_element = self.driver.find_element("id", "email-pin-submit-button")
            submit_element.click()
            return True
        else:
            raise BaseException(f"Driver not on correct url, current url is {self.driver.current_url} -- Should contain checkpoint")

【问题讨论】:

  • 您好,欢迎来到 SO!请edit该问题将其限制为具有足够详细信息的特定问题以识别适当的答案。避免一次问多个不同的问题。请参阅How to Ask 页面以获得澄清此问题的帮助。
  • 感谢您的反馈,但我不是新手。我只是不太了解我的问题,无法简洁地识别它;如果我这样做了,我敢肯定我不会问这样的问题。

标签: javascript python django ajax selenium-chromedriver


【解决方案1】:

有两种方法可以解决这个问题。 一种方法是在视图之外创建对象实例,这有点麻烦并且完全不可扩展,但我能够通过 web 浏览器使用 selenium 验证我的电子邮件帐户。我不必在视图之间传递对象,因为它是全局的。

第二种方法是不使用硒。这就是我最终做的事情。 如果有人对这种方法感兴趣,请给我留言或查看 pyppeteer。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 2013-03-09
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2011-12-07
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多