728x90
반응형
import requests as rq
url = "https://hello-ming.tistory.com/"
res=rq.get(url) #get방식으로 접근

이 url을 res로 지정 후

 

res.text #html 코드를 가져온다.

res.content #content, text는 한글 깨짐, utf-8 euc-kr

 

res.encoding #이 브라우저 페이지가 인코딩을 utf-8로 함을 알 수 있다.

 

 

 

 

728x90
반응형
728x90
반응형

 

* 주피터 노트북에서 실행하였다.

 

import requests

 

만약 실행되지 않는다면 주피터 노트북 상에서 설치하는 방법이 있다.

 

!pip install requests

 

pwd #현재 위치

실명이라 가렸다.

 

import requests as rq
url = "https://hello-ming.tistory.com/"
res=rq.get(url) #get방식으로 접근
print(res) # <Response [200]>

rq.post(url) # <Response [200]>

res.status_code # 200

 

def url_check(url):
    res = rq.get(url)
    
    print(res)
    sc = res.status_code
    if sc==200:
        print("%s 요청 성공"%(url))
    elif sc==404:
        print("%s 알 수 없는 에러 "%(url))
    else:
        print("%s 알 수 없는 에러:%s "%(url,sc))

headers=res.headers #헤더들을 가져온다.
headers

type(headers) 

딕셔너리인것을 알 수 있다.

 

headers['Date'] #딕셔너리라 key값을 주면 value를 불러올 수 있다.

 

#반복문을 이용하여 항목 출력
for i in headers:
    print('1) key : ',i,' 2) values : ',headers[i])

728x90
반응형
728x90
반응형

2021.06.07 - [BACK-END/Django] - [Django] cmd로 가상환경 만들기 / 기본환경셋팅

 

[Django] cmd로 가상환경 만들기 / 기본환경셋팅

cmd를 이용하여 Django에 필요한 가상환경을 만들것이다. 파이썬이 있어야한다! django를 설치할 파일을 미리 만들어 주었다. 로컬 디스크 c에 python3이라는 폴더를 만들어 주었다. cmd창에 들어간다. c

hello-ming.tistory.com

 

위의 포스팅 이후에 작성한 글이므로 전 포스팅의 기본환경셋팅과 연결된다!

 

나는 그동안 PyCharm Edu로 써왔어서 이번에 다시 설치하게 되었다.

 

파이참(PyCharm)  Community 버전으로 설치한다.

https://www.jetbrains.com/pycharm/download/#section=windows 

 

 

파이참을 실행해서 프로젝트를 새로 만든다.

 

 

Virtualen을 이용해서 C:\python3\venv 폴더에 파이썬 3.6의 가상환경을 생성하겠다는 뜻이다.

 

가상환경 생성중

 

CLI 환경을 파이참에서 설치할 것이다.

 

settings - Project Interpreter 에 들어간다.

 

 

+ 버튼을 눌러준다.

 

 

전 포스팅에서 cmd로 Django를 설치했는데 그 패키지 안의 python.exe와 연결해준다.

 

Django와 연결됨을 확인할 수 있다.

 

파이참 내의 terminal을 연다.

 

 

이런식으로 (django)로 시작하면 성공된 것이다.

 

mysite 라는 django 프로젝트 이름을 생성할 것이다. 

 

중요한 것은 [ mysite . ]  여기에 . 이 없으면 mysite 안에 또 만들어서 꼭 . 를 붙여줘야 한다.

 

어플리케이션은 생성되었고 polls를 생성해보자

 

polls는 여론조사 같은것이다.  실행하면 polls라는 앱이 생성된다.

 

mysite는 프로젝트 이름이고 polls는 어플리케이션이다.

 

 

runserver는 브라우저를 돌리는 것이다.

 

 

위 사이트를 CTRL을 누른채로 클릭하면 새창에 뜨는데 밑에 그림이 뜬다면 연결된것이다.

 

 

django를 시작할 준비가 되었다는 뜻이다.

728x90
반응형
728x90
반응형

 

cmd를 이용하여 Django에 필요한 가상환경을 만들것이다. 파이썬이 있어야한다!

 

django를 설치할 파일을 미리 만들어 주었다. 로컬 디스크 c에 python3이라는 폴더를 만들어 주었다.

 

cmd창에 들어간다.

 

cd를 이용하여 django를 설치할 파일로 이동한다.

 

python -m venv django

 

그 후 cd로 django 파일로 이동한 뒤 dir을 이용하여 설치되었는지 확인한다.

 

 

Scrips\activate

 

django를 설치한다.

 

pip install django

 

 

하면 만들어진 가상환경에 django가 설치가 된다.

 

728x90
반응형
728x90
반응형

2021.06.07 - [FRONT-END/React] - [React] 리액트 & socket.io 기반 채팅 어플리케이션 만들기 - 3

 

[React] 리액트 & socket.io 기반 채팅 어플리케이션 만들기 - 3

2021.06.04 - [FRONT-END/React] - [React] 리액트 & socket.io 기반 채팅 어플리케이션 만들기 - 2 [React] 리액트 & socket.io 기반 채팅 어플리케이션 만들기 - 2 1탄을 보지 않고 2탄부터 오셨다면 꼭 보고 오..

hello-ming.tistory.com

 

전 포스팅에서 모든 코드를 적용하고 돌린 작업을 하였다. 

 

이번시간은 전체적인 동작과 코드설명을 할 것이다.

 

 

채팅을 하기 위해 localhost:3000으로 두 개의 창을 띄어준다.

 

 

사용자 이름을 다르게 입력한다. room은 반드시 같은 값으로 해줘야 채팅할 수 있다!

 

아이스베어 먼저 입장한 후 그리즐리를 입장할 것이다.

 

좌 : 아이스베어    우 : 그리즐리

 

아이스베어의 채팅차에는 그리즐리가 가입했다고 뜬다.

 

이제 대화를 해보도록 하자

 

 

화면을 크게하면 사진의 오른쪽 부분처럼 채팅중인 사람의 목록도 볼 수 있다.

 

아이스 베어가 방을 나가보았다.

 

 

아이스베어가 나갔다고 뜨고 오른쪽에도 온라인 표시가 사라졌음을 확인할 수 있다.

728x90
반응형
728x90
반응형

 

2021.06.04 - [FRONT-END/React] - [React] 리액트 & socket.io 기반 채팅 어플리케이션 만들기 - 2

 

[React] 리액트 & socket.io 기반 채팅 어플리케이션 만들기 - 2

1탄을 보지 않고 2탄부터 오셨다면 꼭 보고 오시길 바랍니다. 2021.06.04 - [FRONT-END/React] - [React] React로 Chat Application 구현하기 -1 [React] React로 Chat Application 구현하기 -1 https://www.youtu..

hello-ming.tistory.com

 

이어서 할것이다!

 

이번 포스팅에는 전 포스팅에서 폴더와 js파일을 만들어놨었는데 이번에는 js 내용을 채울것이다!

 

server에 users.js를 생성한 후 내용을 채운다.

 

const users = []

const addUser = ({ id, name, room }) => {
//이름의 공백 제거
  name = name.trim().toLowerCase()
  room = room.trim().toLowerCase()

  const existingUser = users.find(
    (user) => user.room === room && user.name === name
  )

  if (!name || !room) return { error: '사용자 이름과 방이 필요합니다.' }
  if (existingUser) return { error: '이미 사용중인 이름입니다.' }

  const user = { id, name, room }

  users.push(user)

  return { user }
}

const removeUser = (id) => {
  const index = users.findIndex((user) => user.id === id)

  if (index !== -1) return users.splice(index, 1)[0]
}

const getUser = (id) => users.find((user) => user.id === id)

const getUsersInRoom = (room) => users.filter((user) => user.room === room)

module.exports = { addUser, removeUser, getUser, getUsersInRoom }

 

기존에 만들어 놓은 server/index.js에 아래의 내용으로 바꿔준다.

const express = require('express')
const socketio = require('socket.io')
const http = require('http')

const cors = require('cors')
const router = require('./router')
const { addUser, removeUser, getUser, getUsersInRoom } = require('./users.js')

const PORT = process.env.PORT || 5000

const app = express()
const server = http.createServer(app)
const io = socketio(server)
app.use(cors())
app.use(router)

io.on('connection', (socket) => {
  console.log('새로운 connection이 발생하였습니다.')
  socket.on('join', ({ name, room }, callback) => {
    const { error, user } = addUser({ id: socket.id, name, room })
    if (error) callback({ error: '에러가 발생했어요.' })

    socket.emit('message', {
      user: 'admin',
      text: `${user.name}, ${user.room}에 오신것을 환영합니다.`,
    })
    socket.broadcast.to(user.room).emit('message', {
      user: 'admin',
      text: `${user.name} 님이 가입하셨습니다.`,
    })
    io.to(user.room).emit('roomData', {
      room: user.room,
      users: getUsersInRoom(user.room),
    })
    socket.join(user.room)

    callback()
  })
  socket.on('sendMessage', (message, callback) => {
    const user = getUser(socket.id)
    io.to(user.room).emit('message', { user: user.name, text: message })
    callback()
  })
  socket.on('disconnect', () => {
    const user = removeUser(socket.id)

    if (user) {
      io.to(user.room).emit('message', {
        user: 'Admin',
        text: `${user.name} 님이 방을 나갔습니다.`,
      })
      io.to(user.room).emit('roomData', {
        room: user.room,
        users: getUsersInRoom(user.room),
      })
    }
    console.log('유저가 떠났어요.')
  })
})
server.listen(PORT, () => console.log(`서버가 ${PORT} 에서 시작되었어요`))

 

Chat.js을 수정한다.

import React, { useState, useEffect } from 'react'
import queryString from 'query-string'
import io from 'socket.io-client'

import TextContainer from '../TextContainer/TextContainer'
import Messages from '../Messages/Messages'
import InfoBar from '../InfoBar/InfoBar'
import Input from '../Input/Input'

import './Chat.css'

const ENDPOINT = 'http://localhost:5000'

let socket

const Chat = ({ location }) => {
  const [name, setName] = useState('')
  const [room, setRoom] = useState('')
  const [users, setUsers] = useState('')
  const [message, setMessage] = useState('')
  const [messages, setMessages] = useState([])

  useEffect(() => {
    const { name, room } = queryString.parse(location.search)

    socket = io(ENDPOINT)

    setRoom(room)
    setName(name)

    socket.emit('join', { name, room }, (error) => {
      if (error) {
        alert(error)
      }
    })
  }, [ENDPOINT, location.search])

  useEffect(() => {
    socket.on('message', (message) => {
      setMessages((messages) => [...messages, message])
    })

    socket.on('roomData', ({ users }) => {
      setUsers(users)
    })
  }, [])

  const sendMessage = (event) => {
    event.preventDefault()

    if (message) {
      socket.emit('sendMessage', message, () => setMessage(''))
    }
  }

  return (
    <div className='outerContainer'>
      <div className='container'>
        <InfoBar room={room} />
        <Messages messages={messages} name={name} />
        <Input
          message={message}
          setMessage={setMessage}
          sendMessage={sendMessage}
        />
      </div>
      <TextContainer users={users} />
    </div>
  )
}

export default Chat

 

infoBar.js에 내용을 추가한다.

import React from 'react'

import onlineIcon from '../../icons/onlineIcon.png'
import closeIcon from '../../icons/closeIcon.png'

import './InfoBar.css'

const InfoBar = () => {
  ;<div className='infoBar'>
    <div className='leftInnerContainer'>
      <img className='onlineIcon' src={onlineIcon} alt='online icon' />
      <h3>{room}</h3>
    </div>
    <div className='rightInnerContainer'>
      <a href='/'>
        <img src={closeIcon} alt='close icon' />
      </a>
    </div>
  </div>
}

export default InfoBar

 

위 코드의 png를 적용하기 위해 사진을 넣어줄 것이다.

 

코드안의 경로와 맞게 src에 icons라는 폴더를 만들어 이미지를 넣어주면 된다. 

 

이미지.zip
0.00MB

 

input.js에 내용을 추가한다.

import React from 'react'

import './Input.css'

const Input = ({ setMessage, sendMessage, message }) => (
  <form className='form'>
    <input
      className='input'
      type='text'
      placeholder='전송하려는 메세지를 입력하세요.'
      value={message}
      onChange={({ target: { value } }) => setMessage(value)}
      onKeyPress={(event) =>
        event.key === 'Enter' ? sendMessage(event) : null
      }
    />
    <button className='sendButton' onClick={(e) => sendMessage(e)}>
      전송
    </button>
  </form>
)

export default Input

 

Messages폴더 안의 Messages.js에 내용을 추가한다.

import React from 'react'

import ScrollToBottom from 'react-scroll-to-bottom'

import Message from './Message/Message'

import './Messages.css'

const Messages = ({ messages, name }) => (
  <ScrollToBottom className='messages'>
    {messages.map((message, i) => (
      <div key={i}>
        <Message message={message} name={name} />
      </div>
    ))}
  </ScrollToBottom>
)

export default Messages

 

Messages폴더 안의 Message의 Message.js에 내용을 추가한다.

import React from 'react'

import './Message.css'

import ReactEmoji from 'react-emoji'

const Message = ({ message: { text, user }, name }) => {
  let isSentByCurrentUser = false

  const trimmedName = name.trim().toLowerCase()

  if (user === trimmedName) {
    isSentByCurrentUser = true
  }

  return isSentByCurrentUser ? (
    <div className='messageContainer justifyEnd'>
      <p className='sentText pr-10'>{trimmedName}</p>
      <div className='messageBox backgroundBlue'>
        <p className='messageText colorWhite'>{ReactEmoji.emojify(text)}</p>
      </div>
    </div>
  ) : (
    <div className='messageContainer justifyStart'>
      <div className='messageBox backgroundLight'>
        <p className='messageText colorDark'>{ReactEmoji.emojify(text)}</p>
      </div>
      <p className='sentText pl-10 '>{user}</p>
    </div>
  )
}

export default Message

 

TextContainer.js에도 내용을 추가한다.

import React from 'react'

import onlineIcon from '../../icons/onlineIcon.png'

import './TextContainer.css'

const TextContainer = ({ users }) => (
  <div className='textContainer'>
    <div>
      <h1>
        실시간 채팅 프로그램{' '}
        <span role='img' aria-label='emoji'>
          💬
        </span>
      </h1>
      <h2>
        Created with React, Express, Node and Socket.IO{' '}
        <span role='img' aria-label='emoji'>
          ❤️
        </span>
      </h2>
      <h2>
        Try it out right now!{' '}
        <span role='img' aria-label='emoji'>
          ⬅️
        </span>
      </h2>
    </div>
    {users ? (
      <div>
        <h1>현재 채팅중인 사람들 : </h1>
        <div className='activeContainer'>
          <h2>
            {users.map(({ name }) => (
              <div key={name} className='activeItem'>
                {name}
                <img alt='Online Icon' src={onlineIcon} />
              </div>
            ))}
          </h2>
        </div>
      </div>
    ) : null}
  </div>
)

export default TextContainer

 

모든 코드를 작성하면 

 

localhost:3000/ 에 이런 화면이 뜨고 가입을 누르면

 

 

채팅창이 뜬것을 확인할 수 있다.

 

다음 포스팅은 전체적인 채팅방 동작과 코드설명을 할 것이다.

728x90
반응형
728x90
반응형

2021.06.04 - [FRONT-END/React] - [React] 리액트 & socket.io 기반 채팅 어플리케이션 만들기 - 2

 

[React] 리액트 & socket.io 기반 채팅 어플리케이션 만들기 - 2

1탄을 보지 않고 2탄부터 오셨다면 꼭 보고 오시길 바랍니다. 2021.06.04 - [FRONT-END/React] - [React] React로 Chat Application 구현하기 -1 [React] React로 Chat Application 구현하기 -1 https://www.youtu..

hello-ming.tistory.com

 

위 블로그 포팅하다가 socket 버전이 맞지않아 오류가 떠서 해결방법을 소개하고자 한다!

 

꼭 socket의 버전이 안맞을때, 위 포스팅을 따라하는 것이 아니더라도

 

이 방법은 다른 프로젝트를 하시다가 이처럼 버전이 맞지 않을때

 

도움이 될 것이므로 Tip 카테고리에 쓰기로 하였다!

 

그동안 npm i install 이처럼 하다보면 최신버전을 다운받게 되는데 최신버전으로하면 연결이 되지 않았다. 

 

그래서 영상에 있는 version을 쓰기로 하였다.

 

socket 버전이 안맞을 때 node_modules를 삭제하고 다시 설치하는 방법이다.

우선 

자신이 chatting 프로그램을 저장한 파일에 들어가 client의 node_modules 삭제한다.

 

server의 node_modules도 삭제한다.

 

 

그리고 Visual Stiduo Code 에 들어가서

 

 

이 사진은 리액트 포스팅한 글에 참조된 사진인데 version을 바꿔준다.

 

client의 package.json

 "query-string": "^6.8.2",
    "react": "^16.9.0",
    "react-dom": "^16.9.0",
    "react-emoji": "^0.5.0",
    "react-router-dom": "^5.0.1",
    "react-scripts": "3.1.1",
    "react-scroll-to-bottom": "^1.3.2",
    "socket.io-client": "^2.2.0"

 

server의 package.json

 "cors": "^2.8.5",
    "express": "^4.17.1",
    "nodemon": "^2.0.7",
    "socket.io": "^2.2.0"

 

다시 설치를 하기 위해 client에 들어가 npm i를 해준다.

 

 

설치를 하고 난 후 server에 들어가 npm i를 해준다.

 

 

설치가 다 되면 실행하기 위해 server와 client에 npm run start를 해주면 실행이 된다.

 

 

 

가입을 누르면 새로운 connection이 발생하였다고 뜨고 

 

새로고침을 눌렀을때 유저가 떠났다는 말이 console창이 뜬다면 서버가 통신이 잘됨을 확인할 수 있다!

 

 

 

728x90
반응형
728x90
반응형

 

본 포스팅을 시작하기 앞서 나는 MongoDB Compass가 깔려있는 상태이다.

 

 

backend폴더로 이동해 (즉 server의 위치) 

 

mongoose.connect(process.env.MONGODB_URL || 'mongodb://localhost/amazona', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useCreateIndex: true,
})

이걸 붙여준다 나는 express() 밑에  붙여주었다.

 

mongoose를 설치했는데도 import가 되지 않을때는 

 

npm i express-async-handler

 

 

테스트 하기위에 data.js에 users 데이터를 추가해준다.

 

data.js

import bcrypt from 'bcryptjs'

const data = {
  users: [
    {
      name: 'Basir',
      email: 'adming@example.com',
      password: bcrypt.hashSync('1234', 8),
      isAdmin: false,
    },
    {
      name: 'John',
      email: 'John@example.com',
      password: bcrypt.hashSync('1234', 8),
      isAdmin: false,
    },
  ]}

 

MongoDB Cluster에 접속하여 구글계정으로 로그인 하고 

본명이 있어 급하게 지웠다.

 

나의 MongoDB 주소를 알 수 있다. 이것을

 

아까 mongoose.connect() 코드에 url 주소를 붙여준다.

 

mongoose.connect(
  process.env.MONGODB_URL ||
    'mongodb+srv://(아이디):(비밀번호)@cluster0.bueqv.mongodb.net/test',
  {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
  }
)

 

테스트 하기위해 인터넷 창에

 

http://localhost:5000/api/users/seed

 검색한다.

 

아까 data.js에 users 데이터를 추가한 것이 JSON형식으로 보인다.(저는 JSON Viewer를 설치했기 때문에 보여요.)

 

 

MongoDB Compass 클릭하면 tests에 user 데이터가 들어왔음을 확인할 수 있다.

 

728x90
반응형
728x90
반응형

has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

 

No 'Access-Control-Allow-Origin' header ... 너무 화가 났다 맞는 방법 다 했는데도 같은 오류가 자꾸 떠서

 

 

결과로 바로 말하자면 클라이언트 쪽에 전송을 추가하면 된다고 한다.

 

const socket = io("localhost:5000", { transports: ["websocket"] });

 

 


[혼잣말]

 

구글링을 해보면  이 패키지를 설치하라고 하고

npm i cors

 

이것을 요구하라는 코드를 작성하라고 하는데

const cors = require('cors');
app.use(cors());

 

나는.. 예제를 보고 하는 입장이라 다 따라 했는데도 오류가 떠서 속상했다. 

 

구글링 하다가 클라이언트 측에 전송을 추가하라는 글을 보게 되었다.

 

const socket = io("localhost:5000", { transports: ["websocket"] });

 

처음에는 이거 해도 되지 않았다. 다른 오류들이 떴다.

 

nternal/modules/cjs/loader.js:883   throw err;

 

..........................................

[nodemon] app crashed - waiting for file changes before starting...

 

아마 내가 계속 시도해서 그런가... 구글링 해보니 다 삭제하고 설치하라는 글도 많았고...

 

npm link socket.io도 해보고 다 별걸 다 하다가 다시 껐다 켜고 반복하다 보니 갑자기 잘 실행돼서 당황스럽다.

 

 

728x90
반응형
728x90
반응형

internal/modules/cjs/loader.js:883
  throw err;
  ^

Error: Cannot find module 'socket.io'

 

분명 socket.io를 설치했는데 module이 찾을 수 없다는 오류가 떴다.

 

구글링을 통해 알아냈다.

 

npm link socket.io
728x90
반응형

+ Recent posts