-
-
Save Priler/8c3eb5b26e6bcac57b56dc70b3277bba to your computer and use it in GitHub Desktop.
import asyncio | |
from pywebio import start_server | |
from pywebio.input import * | |
from pywebio.output import * | |
from pywebio.session import defer_call, info as session_info, run_async, run_js | |
chat_msgs = [] | |
online_users = set() | |
MAX_MESSAGES_COUNT = 100 | |
async def main(): | |
global chat_msgs | |
put_markdown("## 🧊 Добро пожаловать в онлайн чат!\nИсходный код данного чата укладывается в 100 строк кода!") | |
msg_box = output() | |
put_scrollable(msg_box, height=300, keep_bottom=True) | |
nickname = await input("Войти в чат", required=True, placeholder="Ваше имя", validate=lambda n: "Такой ник уже используется!" if n in online_users or n == '📢' else None) | |
online_users.add(nickname) | |
chat_msgs.append(('📢', f'`{nickname}` присоединился к чату!')) | |
msg_box.append(put_markdown(f'📢 `{nickname}` присоединился к чату')) | |
refresh_task = run_async(refresh_msg(nickname, msg_box)) | |
while True: | |
data = await input_group("💭 Новое сообщение", [ | |
input(placeholder="Текст сообщения ...", name="msg"), | |
actions(name="cmd", buttons=["Отправить", {'label': "Выйти из чата", 'type': 'cancel'}]) | |
], validate = lambda m: ('msg', "Введите текст сообщения!") if m["cmd"] == "Отправить" and not m['msg'] else None) | |
if data is None: | |
break | |
msg_box.append(put_markdown(f"`{nickname}`: {data['msg']}")) | |
chat_msgs.append((nickname, data['msg'])) | |
refresh_task.close() | |
online_users.remove(nickname) | |
toast("Вы вышли из чата!") | |
msg_box.append(put_markdown(f'📢 Пользователь `{nickname}` покинул чат!')) | |
chat_msgs.append(('📢', f'Пользователь `{nickname}` покинул чат!')) | |
put_buttons(['Перезайти'], onclick=lambda btn:run_js('window.location.reload()')) | |
async def refresh_msg(nickname, msg_box): | |
global chat_msgs | |
last_idx = len(chat_msgs) | |
while True: | |
await asyncio.sleep(1) | |
for m in chat_msgs[last_idx:]: | |
if m[0] != nickname: # if not a message from current user | |
msg_box.append(put_markdown(f"`{m[0]}`: {m[1]}")) | |
# remove expired | |
if len(chat_msgs) > MAX_MESSAGES_COUNT: | |
chat_msgs = chat_msgs[len(chat_msgs) // 2:] | |
last_idx = len(chat_msgs) | |
if __name__ == "__main__": | |
start_server(main, debug=True, port=8080, cdn=False) |
ты мой код не видел еще)))
1. pep8 - отступы перед и после функций, 2 строчки, а не 1; в конце должна быть пустая строка 2. глобальная переменная - зло. 3. звёздочный импорт. Двойной звёздочный импорт. [Просто оставлю это здесь](https://github.com/floordiv/nostarimport) 4. зачем использовать список `chat_msgs`, когда для этих целей нужен `asyncio.Queue`? 5. зачем при достижении лимита сообщений, делить список надвое? Это потенциально может не сработать. Для этого, либо использовать подходящий для этого инструментарий (`asyncio.Queue`), либо, в крайнем случае, при достижении лимита делать `del chat_msgs[100:]`, что всё равно лучше метода, представленного в коде. 6. строка 57, цикл for, из которого потом к значению всегда обращаются по индексу. Зачем? `for nickname, message_text in chat_msgs[last_idx:]` явно смотрелось бы здесь лучше 7. ну и ещё пара замечаний по поводу нейминга (n, m), а также длины строк (21 строка как явный пример)
Нашел чем гордиться.
- pep8 - отступы перед и после функций, 2 строчки, а не 1; в конце должна быть пустая строка
- глобальная переменная - зло.
- звёздочный импорт. Двойной звёздочный импорт. Просто оставлю это здесь
- зачем использовать список
chat_msgs
, когда для этих целей нуженasyncio.Queue
?- зачем при достижении лимита сообщений, делить список надвое? Это потенциально может не сработать. Для этого, либо использовать подходящий для этого инструментарий (
asyncio.Queue
), либо, в крайнем случае, при достижении лимита делатьdel chat_msgs[MAX_MESSAGES_COUNT:]
, что всё равно лучше метода, представленного в коде.- строка 57, цикл for, из которого потом к значению всегда обращаются по индексу. Зачем?
for nickname, message_text in chat_msgs[last_idx:]
явно смотрелось бы здесь лучше- ну и ещё пара замечаний по поводу нейминга (n, m), а также длины строк (21 строка как явный пример)
- Лень нажимать Alt+Enter
- Ок
- Ок
- Код чата взят с демок, я его лишь упростил
- См. пункт 4, у меня не было задачи улучшить код с демок либы
- Тут согласен, но опять же пункт 5.
- Ок
Спасибо за рефакторинг, но не стоило.
Лучше взгляни на код самурая и сделай его рефактор, будет больше пользы - https://github.com/Priler/samurai
О чо нашел! https://github.com/pywebio/demos/blob/main/online_chatroom.py
Молодец, но я не говорил что автор данного кода + показал библиотеку и оставил ссылку не репозиторий из данной ссылки.
Хотя, мой вариант чата слегка упрощен.
Друзья помогите как локальний хост открыть для все , а то я пробую открыть на телефоне и пишет что локальний хост не не позволяет присоединиться
Друзья помогите как локальний хост открыть для все , а то я пробую открыть на телефоне и пишет что локальний хост не не позволяет присоединиться
На телефоне нельзя
Пахнет пастингом, всё в классике Хауди Хо)
@monojer010, твой вариант - repl.it
а как запустить?
как запустить проект? я пробовал включать локальный сервер и чот не вышло
в интернете говорили, что надо включать томкат и не сработало(
Ребят, помогите новичку, пожалуйста. Как сделать так, что бы он стал доступен в сети?
Хостинг нужен, например хероку или реплит (если бесплатный хостинг использовать), а платные я хз какие нормальные есть и поддерживают питон.
как запустить проект? я пробовал включать локальный сервер и чот не вышло в интернете говорили, что надо включать томкат и не сработало(
а ты порт подключил?
в коде
О чо нашел! https://github.com/pywebio/demos/blob/main/online_chatroom.py
404 кидает
Привет! Создал хост на джанго при помощи https://www.pythonanywhere.com а шо дальше? не пойму как добавить сервер в код что бы он запускался не только внутри моей сети.
есть версия без pywebio?
что делать если я запускаю код и у меня Traceback (most recent call last):
File "J:\Игрыфайлы\пайтон\скрипты\site.py", line 1, in
import asyncio
File "C:\Users\Acer\AppData\Local\Programs\Python\Python310\lib\asyncio_init_.py", line 8, in
from .base_events import *
File "C:\Users\Acer\AppData\Local\Programs\Python\Python310\lib\asyncio\base_events.py", line 39, in
from . import coroutines
File "C:\Users\Acer\AppData\Local\Programs\Python\Python310\lib\asyncio\coroutines.py", line 5, in
import inspect
File "C:\Users\Acer\AppData\Local\Programs\Python\Python310\lib\inspect.py", line 59, in
for k, v in dis.COMPILER_FLAG_NAMES.items():
AttributeError: module 'dis' has no attribute 'COMPILER_FLAG_NAMES'
Друзья помогите как локальний хост открыть для все , а то я пробую открыть на телефоне и пишет что локальний хост не не позволяет присоединиться
если тебе по быстрому на телефоне хочется чекнуть как он работает, то тебе понадобится скачать ngrok, там в программе самой уже разберешься
классный код спс
О чо нашел!
https://github.com/pywebio/demos/blob/main/online_chatroom.py