首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django -如何在模板中调用带有参数的函数

Django -如何在模板中调用带有参数的函数
EN

Stack Overflow用户
提问于 2022-11-29 12:20:01
回答 3查看 50关注 0票数 0

我有以下基于功能的观点:

代码语言:javascript
复制
def get_emails(request, HOST, USERNAME, PASSWORD):
    context = {
        'FU_HOST': settings.FU_HOST,
        'FU_USERNAME': settings.FU_USERNAME,
        'FU_PASSWORD': settings.FU_PASSWORD,
        'FV_HOST': settings.FV_HOST,
        'FV_USERNAME': settings.FV_USERNAME,
        'FV_PASSWORD': settings.FV_PASSWORD,
        'USV_HOST': settings.USV_HOST,
        'USV_USERNAME': settings.USV_USERNAME,
        'USV_PASSWORD': settings.USV_PASSWORD,
    }
    m = imaplib.IMAP4_SSL(HOST, 993)
    m.login(USERNAME, PASSWORD)
    m.select('INBOX')
    result, data = m.uid('search', None, "ALL")
    if result == 'OK':
        for num in data[0].split():
            result, data = m.uid('fetch', num, '(RFC822)')
            if result == 'OK':
                email_message_raw = email.message_from_bytes(data[0][1])
                email_from = str(make_header(decode_header(email_message_raw['From'])))
                email_addr = email_from.replace('<', '>').split('>')
                if len(email_addr) > 1:
                    new_entry = EmailMarketing(email_address=email_addr[1], mail_server='X')
                    new_entry.save()
                else:
                    new_entry = EmailMarketing(email_address=email_addr[0], mail_server='X')
                    new_entry.save()
    m.close()
    m.logout()

    messages.success(request, f'Subscribers list sychronized successfully.')
    return redirect('subscribers')

我想在前端放置3个按钮,每次调用相同的函数,比如一个按钮get_emails(FU_HOST,FU_USERNAME,FU_PASSWORD),另一个按钮get_emails(USV_HOST,USV_USERNAME,USV_PASSWORD)。

如何才能在Django实现这一点?我的凭据存储在.env文件中。

EN

回答 3

Stack Overflow用户

发布于 2022-11-29 12:35:41

这样的功能不是通过将函数放在前端模板上实现的,您需要做的是将用户重定向到包含该函数的视图,并从用户请求中提取这些值,因为正如您所看到的,您有一些方法正在访问您的数据库,如果可能的话,这不是您可以从前端实现的,也不是安全的。

票数 1
EN

Stack Overflow用户

发布于 2022-11-29 12:44:47

从上下文中我可以理解传递给您的函数的参数必须是安全的。

所以,可以用这样的帖子表:

代码语言:javascript
复制
def get_emails(request):
    context = {
        'FU_HOST': settings.FU_HOST,
        'FU_USERNAME': settings.FU_USERNAME,
        'FU_PASSWORD': settings.FU_PASSWORD,
        'FV_HOST': settings.FV_HOST,
        'FV_USERNAME': settings.FV_USERNAME,
        'FV_PASSWORD': settings.FV_PASSWORD,
        'USV_HOST': settings.USV_HOST,
        'USV_USERNAME': settings.USV_USERNAME,
        'USV_PASSWORD': settings.USV_PASSWORD,
    }

    if request.method == "POST":
        HOST = request.POST["HOST"]
        USERNAME = request.POST["USERNAME"]
        PASSWORD = request.POST["PASSWORD"]

        m = imaplib.IMAP4_SSL(HOST, 993)
        m.login(USERNAME, PASSWORD)
        m.select('INBOX')
        result, data = m.uid('search', None, "ALL")
        if result == 'OK':
            for num in data[0].split():
                result, data = m.uid('fetch', num, '(RFC822)')
                if result == 'OK':
                    email_message_raw = email.message_from_bytes(data[0][1])
                    email_from = str(make_header(decode_header(email_message_raw['From'])))
                    email_addr = email_from.replace('<', '>').split('>')
                    if len(email_addr) > 1:
                        new_entry = EmailMarketing(email_address=email_addr[1], mail_server='X')
                        new_entry.save()
                    else:
                        new_entry = EmailMarketing(email_address=email_addr[0], mail_server='X')
                        new_entry.save()
        m.close()
        m.logout()

        messages.success(request, f'Subscribers list sychronized successfully.')
        return redirect('subscribers')

在模板中,向主机发出一个post请求,用户名和密码如下所示。

代码语言:javascript
复制
<form action="{% url 'name-of-your-view' %}" method="POST">
<input type="text" name="HOST">
<input type="text" name="USERNAME">
<input type="text" name="PASSWORD">
<input type="submit">
</form>
票数 0
EN

Stack Overflow用户

发布于 2022-11-29 13:18:36

对于此场景,如果表单post方法不适合您,则可以使用javascript和ajax。

将以下代码添加到html代码中,以使用javascript方法。

代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script>
    function post(_host,_username,_password){
        $.ajax({
            url: '{% url "url-name"%}',
            type: 'POST',
            data: { 
                csrfmiddlewaretoken: "{{ csrf_token }}",
                host: _host,
                username = _username,
                password = _password
            },
            success: function (res) {
                console.log(res);
            }
        });
    }
</script>

按以下方式更新python函数。

代码语言:javascript
复制
def get_emails(request):
    HOST = request.POST.get('host')
    USERNAME = request.POST.get('username')
    PASSWORD = request.POST.get('password')
    context = {
        'FU_HOST': settings.FU_HOST,
        'FU_USERNAME': settings.FU_USERNAME,
        'FU_PASSWORD': settings.FU_PASSWORD,
        'FV_HOST': settings.FV_HOST,
        'FV_USERNAME': settings.FV_USERNAME,
        'FV_PASSWORD': settings.FV_PASSWORD,
        'USV_HOST': settings.USV_HOST,
        'USV_USERNAME': settings.USV_USERNAME,
        'USV_PASSWORD': settings.USV_PASSWORD,
    }
    m = imaplib.IMAP4_SSL(HOST, 993)
    m.login(USERNAME, PASSWORD)
    m.select('INBOX')
    result, data = m.uid('search', None, "ALL")
    if result == 'OK':
        for num in data[0].split():
            result, data = m.uid('fetch', num, '(RFC822)')
            if result == 'OK':
                email_message_raw = email.message_from_bytes(data[0][1])
                email_from = str(make_header(decode_header(email_message_raw['From'])))
                email_addr = email_from.replace('<', '>').split('>')
                if len(email_addr) > 1:
                    new_entry = EmailMarketing(email_address=email_addr[1], mail_server='X')
                    new_entry.save()
                else:
                    new_entry = EmailMarketing(email_address=email_addr[0], mail_server='X')
                    new_entry.save()
    m.close()
    m.logout()

    messages.success(request, f'Subscribers list sychronized successfully.')
    return redirect('subscribers')

希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74613987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档