Как получить часть URL с помощью aiohttp_jinja2?

#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']