自动上传书籍 django

问题描述 投票:0回答:0

我正在做一个项目,允许我使用 django 将书籍上传到数据库。 出于测试目的和我为了节省时间,我想自动创建一本书的多个实例到数据库。

这是帮助我实现这一目标的代码

import random
import string
import httplib2
from urllib.parse import urlencode

base_url = "http://localhost:8002/addbook/"


def generate_data():
    """
    Generate a dictionary of random book data.
    """
    data = {}
    data["title"] = "".join(random.choices(string.ascii_uppercase, k=8))
    data["author_name"] = "".join(random.choices(string.ascii_uppercase, k=8))
    data["coauthors_name"] = "".join(
        random.choices(string.ascii_uppercase, k=8))
    data["publisher_name"] = "".join(
        random.choices(string.ascii_uppercase, k=8))
    data["isbn"] = "".join(random.choices(string.digits, k=13))
    data["genres_name"] = "".join(random.choices(string.ascii_uppercase, k=8))
    data["edition"] = "".join(random.choices(string.ascii_uppercase, k=8))
    data["description"] = "".join(random.choices(string.ascii_uppercase, k=50))
    data["book_file"] = "/home/dubsy/A Guide to Broiler Chicken Growth Boosters & Probiotics.pdf"

    return data


# Send a GET request to the book upload page to get the CSRF token
http = httplib2.Http()
response, content = http.request(base_url, "GET")
csrf_token = response["set-cookie"].split("=")[1].split(";")[0]

# Generate and send POST requests to upload 100 books
for i in range(100):
    data = generate_data()
    data_encoded = urlencode(data).encode("utf-8")
    headers = {
        "Content-Type": "application/x-www-form-urlencoded",
        "Cookie": f"csrftoken={csrf_token}",
        "Referer": base_url,
        "X-CSRFToken": csrf_token,
    }
    response, content = http.request(
        base_url, "POST", body=data_encoded, headers=headers
    )
    print(f"Response {i+1}: {response}")
    print(content.decode('utf-8'))

代码运行成功,但是它没有将任何内容发布到数据库,而是我在终端中得到以下响应。

Response 1: {'date': 'Fri, 14 Apr 2023 18:21:14 GMT', 'server': 'WSGIServer/0.2 CPython/3.9.12', 'content-type': 'text/html; charset=utf-8', 'x-frame-options': 'DENY', 'vary': 'Cookie', 'content-length': '2931', 'x-content-type-options': 'nosniff', 'referrer-policy': 'same-origin', 'cross-origin-opener-policy': 'same-origin', 'set-cookie': 'csrftoken=hCk4LKQWIvX4TsmC2frQxuOMy3OSsOWY; expires=Fri, 12 Apr 2024 18:21:14 GMT; Max-Age=31449600; Path=/; SameSite=Lax', 'status': '200'}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Upload Books</title>
  <link rel="stylesheet" href="/static/css/quartz.css">
  <link rel="stylesheet" href="/static/css/addbook.css">
</head>

<body>
  <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <div class="container-fluid">
      <a class="navbar-brand" href="javascript:;">Library Management System</a>
      <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
        aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>
      <div class="collapse navbar-collapse" id="navbarNav">
        <ul class="navbar-nav">
          <li class="nav-item">
            <a class="nav-link active" aria-current="page" href="#">Home</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#">Books</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#">Authors</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#">Contact Us</a>
          </li>
        </ul>
        <ul class="navbar-nav ms-auto">
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown"
              aria-expanded="false">
              <img src="" class="rounded-circle border border-3 border-white" alt="Avatar"
                height="45" width="45">
            </a>
            <ul class="dropdown-menu dropdown-menu-end mt-2" aria-labelledby="navbarDropdown">
              <li><a class="dropdown-item" href="/profile/None/">Profile</a></li>
              <li>
                <hr class="dropdown-divider">
              </li>
              <li><a class="dropdown-item" href="/signout/">Sign Out</a></li>
            </ul>
          </li>
        </ul>
      </div>
    </div>
  </nav>
  <div class="container">
    <div class="row">
      <div class="col-sm">
        <div class="card">
          <div class="card-header">
            <h3 class="text-center">Upload Book</h3>
          </div>
          <div class="card-body">
            <form action="/addbook/" method="post" onsubmit="removeISBNMask()" id="addbook" class="needs-validation"
              enctype="multipart/form-data" autocomplete="off">
              <input type="hidden" name="csrfmiddlewaretoken" value="bdQVi4p3VyMHLpGLfpeAlNMHQy0zNEjAiF0PTE5PtTzBuHSd7uvgI7qjerEh5i5o">
              
              <script src="/static/js/index.js" async></script>
              <script src="/static/js/addbook.js" async></script>
            </form>
          </div>
        </div>
      </div>
    </div>
  </div>
</body>

</html>

它返回一个

status=200
响应和我的用于上传书籍的表单模板,除了表单是空的并且它不会向数据库返回任何内容。

views.py

def addbook(request):
    # if not request.user.is_superuser:
    #     return redirect(notfound)
    # else:
    books = Books.objects.all()
    genres = Genre.objects.all()
    authors = Author.objects.all()
    coauthors = CoAuthor.objects.all()
    publishers = Publisher.objects.all()
    if request.method == "POST":
        form = BookForm(request.POST, request.FILES)
        if form.is_valid():
            book = request.FILES.get("book_file")
            title = request.POST.get("title")
            isbn = request.POST.get("isbn")
            genres_name = request.POST.getlist("genres_name")
            author_name = request.POST.get("author_name")
            co_authors = request.POST.getlist("coauthors_name")
            publisher_name = request.POST.get("publisher_name")
            author_name, created = Author.objects.get_or_create(
                name=author_name.title()
            )
            publisher, created = Publisher.objects.get_or_create(
                name=publisher_name.title()
            )

            book = Books.objects.create(
                isbn=isbn,
                title=title.title(),
                publisher=publisher,
                edition=request.POST.get("edition"),
                author=author_name,
                book_file=book,
            )
            for genre in genres_name:
                genre, created = Genre.objects.get_or_create(
                    name=genre.lower())
                book.genres.add(genre)
            if co_authors:
                for co_author in co_authors:
                    coauthor, created = CoAuthor.objects.get_or_create(
                        name=co_author.title()
                    )
                    book.coauthors.add(coauthor)
            return redirect(addbook)
    else:
        form = BookForm()
    context = {
        "form": form,
        "genres": genres,
        "authors": authors,
        "publishers": publishers,
        "books": books,
        "coauthors": coauthors,
    }
    return render(request, "books/addbook.html", context)

我做错了什么

python django automation httplib httplib2
© www.soinside.com 2019 - 2024. All rights reserved.