#python #discord #discord.py #aiohttp
#python #Discord #discord.py #aiohttp
Вопрос:
Итак, я пытаюсь получить часть URL, которая http://example/home?code=123456789
this 123456789
меняется каждый раз, поскольку это oauth, поэтому я пытаюсь ее получить
Это файл py
from aiohttp import web, web_urldispatcher
import discord
from discord.ext import commands
import aiohttp_jinja2
import jinja2
from pathlib import Path
from oauth import Ouath
@aiohttp_jinja2.template('home.html')
async def start(request):
raise web.HTTPSeeOther(location=Ouath.discord_login_url)
@aiohttp_jinja2.template('home.html')
async def login(request):
return
app = web.Application(loop=self.client.loop)
aiohttp_jinja2.setup(app, loader=jinja2.FileSystemLoader(str(here)))
app.router.add_get('/', start)
app.router.add_get('/home', login)
runner = web.AppRunner(app)
await runner.setup()
self.site = web.TCPSite(runner, '127.0.0.1', 5000)
await self.client.wait_until_ready()
await self.site.start()
я хочу распечатать это в HTML-файле
но я не знаю, как получить эту часть
примечание: я редактирую поле кода
Комментарии:
1. если у вас есть строка,
url = "http://example/home?code=123456789"
тогда вы можетеurl.split('?code=')[-1]
или если число всегда находится в конце и оно всегда имеет одинаковую длинуurl[-9:]
. Но там также естьurllib.parse
иurllib.parse.parse_qs(urllib.parse.urlsplit('http://example/home?code=123456789').query)
дает словарь{'code': ['123456789']}
2. это сработает, но для меня это не сработает, потому что, когда я вхожу в систему через discord, он добавляет этот код случайным образом, и это не исправлено, также он изменяется, если я снова вошел в систему или в соответствии с пользователем
Ответ №1:
Поскольку вы используете web
from aiohttp
, вы можете добавить маршрут, который принимает параметр
routes = web.RouteTableDef()
@routes.get('/guild/{guild}')
async def guild(request):
gid = request.match_info['guild']
URL-адрес будет http://localhost:PORT/guild/123456
После того, как вы получили необходимые сведения, вы можете создать шаблон или вернуть ответ.
Комментарии:
1. проблема в том, что
?code=123456789
добавляется при входе на мой сайт с моей учетной записью discord, и она меняется каждый раз, поэтому, если я сделаю то, что вы мне сказали, это будет похожеhttp://example.com/guild/server.name?code=145623789
Ответ №2:
Покопавшись в исходном коде aiohttp_jinja2
и aiohttp
, кажется, вы можете получить его с request.query.get('code')
@aiohttp_jinja2.template('home.html')
async def login(request):
#print('code:', request.query.get('code'))
return {'code': request.query.get('code')}
Если в URL его нет, то он выдает ?code=...
, но вы можете установить другое значение по умолчанию, используя, например, aiohttp_jinja2. — Stack Overflow. — Если в URL его нет, то он выдает None
request.query.get('code', some_default_value)
Документ aiohttp
: запрос web.BaseRequest.запрос
Ответ №3:
Если у вас есть строка, вы можете использовать
URL = 'http://example/home?code=123456789'
code = URL.split('?code=')[-1]
или если число всегда находится в конце и оно всегда имеет одинаковую длину
URL = 'http://example/home?code=123456789'
code = URL[-9:]
Но есть также urllib.parse
и
URL = 'http://example/home?code=123456789'
data = urllib.parse.parse_qs(urllib.parse.urlsplit(URL).query)
предоставляет словарь
{'code': ['123456789']}
и вы можете сделать
code = data.get('code')
и это даст ожидаемый результат, code
или None
если в URL не было ?code=...
.
РЕДАКТИРОВАТЬ Вероятно, вам придется использовать request.url
@aiohttp_jinja2.template('home.html')
async def login(request):
data = urllib.parse.parse_qs(urllib.parse.urlsplit(request.url).query)
code = data.get('code')
return {'code': code}
Потому что data
есть dictionary with "code"
, чтобы вы могли использовать return data
@aiohttp_jinja2.template('home.html')
async def login(request):
data = urllib.parse.parse_qs(urllib.parse.urlsplit(request.url).query)
return data
Комментарии:
1. это сработает, но для меня это не сработает, потому что, когда я вхожу в систему через discord, он добавляет этот код случайным образом, и это не исправлено, также он изменяется, если я снова вошел в систему или в соответствии с пользователем
2. первый метод и специальный третий метод должны работать с любым числом в url. Третий метод должен работать, даже если в url есть другие переменные.
3. так
urllib.parse.parse_qs(urllib.parse.urlsplit('http://example/home?code=123456789').query)
я получу номер, что это вообще такое?4. вы должны получить текущий URL и использовать его в,
urllib.parse.parse_qs(urllib.parse.urlsplit(CURRENT_URL).query)
и он должен выдавать вамcode
из текущего URL.5. да, проблема в том, как мне получить текущий URL-адрес, когда он меняется каждый раз, когда я захожу в систему через discord, плюс мне установить urllib с помощью pip? или это в aiohttp?
Ответ №4:
@aiohttp_jinja2.template('home.html')
async def login(request):
code = urllib.parse.parse_qs(urllib.parse.urlsplit(request).query)
return {'code': code}
нравится это?
Комментарии:
1. во-первых: это место для ответов / решений — если этот код не решает вашу проблему, то для этого кода здесь не место. Лучше вставьте код в свой вопрос или в конечном итоге используйте порталы типа pastebin.org . Второй: сначала попробуйте, затем спросите. У меня нет,
aiohttp_jinja2
поэтому я не знаю, что вы получите вrequest
, но если это не URL, то это не сработает. Вы должны проверить, что вы получаете с помощьюprint(request)
я бы предположил, что вам может понадобитьсяrequest.url
или, может быть, есть дажеrequest.query
илиrequest.args
(как вFlask
) илиrequest.query
, и тогда вы, возможно, уже получите все параметры в виде словаря.2. Я копаюсь в исходном коде
aiohttp_jinja2
иrequest
, и, кажется, у него есть запрос. запрос, который должен предоставить вам словарь, поэтому, возможно, вы можете сделатьrequest.query.get('code')
илиrequest.query['code']