Найти - Пользователи
Полная версия: Как поменять статус заказа в админке с помощью requests.
Начало » Python для новичков » Как поменять статус заказа в админке с помощью requests.
1 2
Tseka
Добрый день , есть админка для работы с заказами интернет магазина. Хочу с помощью POST поменять статус заказа , но не могу правильно всё оформить. Подскажите как правильно отправлять такие данные.

 import requests
s = requests.Session()
s.auth = ('manager', 'pass')
s.headers.update({'x-test': 'true'})
s.headers.update({
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0'})
data = {'status':'2'
        }
url0 = 'здесь адрес входа в админку'
url='здесь адрес заказа в админке'
s.get(url0,headers=s.headers)
r=s.post(url,data=data,headers=s.headers)

Cкрины
https://ibb.co/f2Lnwv
https://ibb.co/b4uEbv
https://ibb.co/f5Qy3a
keodomir
А у вас авторизация проходит?
response = s.get(url0,headers=s.headers)
print(response.content)
тут есть примеры https://khashtamov.com/ru/python-requests/
Vintets
Ты неправильно отправляешь. Там же Multipart-Encoded. Почитай в справке requests.

 files = {'status': '2'}
r = s.post(url, files=files)

У меня правильно принималось только так:
 files = {'status': ('', '2')}
r = s.post(url, files=files)
но там были и поля с файлами.


Не нужно в сессии писать headers=s.headers Это безсмысленно. headers и cookies и так передаются.
Если нужно в одном из запросов передать отличный от других headers, то можно указать его, чтоб не добавлять/удалять в сессионный.
Tseka
keodomir
А у вас авторизация проходит?
Да проходит.
keodomir
Посмотрите, как выглядит запрос, когда вы нажимаете кнопку. Можно, например, через расширения браузера. Я использую это:
https://chrome.google.com/webstore/detail/jquery-ajax-capture/hgicjmfpmakeejdfemjhokokaijfdjng?utm_source=chrome-app-launcher-info-dialog

После этого можно будет легко сымитировать запрос.
Vintets
Он же это всё сделал и приложил скрины.
По ним видно,что запрос Content-Type: multipart/form-data;
Tseka
 <!-- Основная форма -->
<form method=post id=order enctype="multipart/form-data">
<input type=hidden name="session_id" value="rho48g04hq58qot9ir5j13h711">
<div id="name">
    <input name=id type="hidden" value="99153"/>
    <h1>Заказ №99153        <select class=status name="status">
            <option value='0' >Новый</option>
            <option value='1' >Принят</option>
            <option value='2' >Выполнен</option>
            <option value='3' selected>Удален</option>
        </select>

Когда отправляю POST то всегда в print(r.text) <option value='0' selected>Новый</option> .
Vintets
А почему ты отправляешь только одно поле?
Там же есть поле с номером заказа. Ещё ‘session_id’.
Как минимум нужно ещё их отправлять. Сервер разбирая ответ оттуда берёт данные куда ему в базу вставлять и к чему подвязывать.

Может там ещё что важное есть, что не влезло в скрин.

 files = {
        'id':('', 99153),
        'session_id':('', 'rho48g04hq58qot9ir5j13h711'),
        'status':('', 2)
        }

Где ты их будешь брать? Наверно парсить страницу, может session_id только там. А может и в куках.
Номер заказа есть наверно в параметрах твоего url.
В любом случае проще вытянуть со страницы, чтоб не ошибиться.
Tseka
Vintets
Может там ещё что важное есть, что не влезло в скрин.
 var formData = {
  "address": "Город,ул. Миргородская д.39-а, кв.8",
  "comment": "",
  "coupon_discount": "0.00",
  "delivery_id": "3",
  "delivery_price": "0.00",
  "discount": "0.00",
  "email": "",
  "id": "99153",
  "nalozhka": "1",
  "name": "Алла ",
  "note": "наложка(И) + Отправка 07,09",
  "np_city": "Марин",
  "np_warehouse": "Отделение №2 (до 30 кг): ул. Пирсовая, 2а",
  "order_option": "nalozhka",
  "payment_method_id": "5",
  "phone": "38099хххххххх",
  "purchases[amount][127654]": "1",
  "purchases[id][127654]": "127654",
  "purchases[price][127654]": "260.00",
  "purchases[variant_id][127654]": "26419",
  "related": "",
  "separate_delivery": "1",
  "session_id": "hov62ku9iolsrmcv7mhhri8fj6",
  "status": "2",
  "ttn": "2ХХХХХХХХХХХХ4",
  "user_id": ""
};
$.post('http://ххххххххххххххххххххххххх/index.php?module=OrderAdmin&page=2&id=99153', formData)
  .done (showResult)
  .fail(showError);

Вот с помощью приложения ,которое порекомендовал keodomir .
делал так s.post(url=url,data=formData) и s.post(url=url,files=formData)

Без изменений.
Vintets
Показывай новый код с передачей files.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB