묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결애플 웹사이트 인터랙션 클론!
스크롤하이트가 정의되지않았다고 에러뜨는데 왜일까요,,??
(() => { let yOffset = 0; // window.pageYOffset 대신 쓸 변수 let prevScrollHeight = 0; // 현재 스크롤 위치 (yOffset) 보다 이전에 위치한 스크롤 섹션들의 스크롤 높이 합 let currentScene = 0; // 현재 활성화 된(눈 앞에 보고 있는) 씬 (scroll-section) let enterNewScene = false; // 새로운 씬이 시작 된 순간 true const sceneInfo = [ { //0 type: 'sticky', heightNum: 5, //브라우저 높이의 5배로 scrollHeight 세팅 scrollHeight: 0, objs: { container: document.querySelector('#scroll-section-0'), messageA: document.querySelector('#scroll-section-0 .main-message.a'), messageB: document.querySelector('#scroll-section-0 .main-message.b'), messageC: document.querySelector('#scroll-section-0 .main-message.c'), messageD: document.querySelector('#scroll-section-0 .main-message.d'), canvas: document.querySelector('#video-canvas-0'), context: document.querySelector('#video-canvas-0').getContext('2d'), videoImages: [] }, values: { videoImageCount: 300, imageSequenc: [0, 299], canvas_opacity: [1, 0, {start: 0.9, end: 1 }], messageA_opacity_in: [0, 1, { start: 0.1, end: 0.2 }], messageB_opacity_in: [0, 1, { start: 0.3, end: 0.4 }], messageC_opacity_in: [0, 1, { start: 0.5, end: 0.6 }], messageD_opacity_in: [0, 1, { start: 0.7, end: 0.8 }], messageA_translateY_in: [20, 0, { start: 0.1, end: 0.2 }], messageB_translateY_in: [20, 0, { start: 0.3, end: 0.4 }], messageC_translateY_in: [20, 0, { start: 0.5, end: 0.6 }], messageD_translateY_in: [20, 0, { start: 0.7, end: 0.8 }], // 20=> translateY를 20%만큼 조정, %는 밑에 playAnimation()에서 붙여줄 거임 messageA_opacity_out: [1, 0, { start: 0.25, end: 0.3 }], messageB_opacity_out: [1, 0, { start: 0.45, end: 0.5 }], messageC_opacity_out: [1, 0, { start: 0.65, end: 0.7 }], messageD_opacity_out: [1, 0, { start: 0.85, end: 0.9 }], messageA_translateY_out: [0, -20, { start: 0.25, end: 0.3 }], messageB_translateY_out: [0, -20, { start: 0.45, end: 0.5 }], messageC_translateY_out: [0, -20, { start: 0.65, end: 0.7 }], messageD_translateY_out: [0, -20, { start: 0.85, end: 0.9 }] } }, //1 { type: 'normal', // heightNum: 5, // type normal에서는 필요없음 scrollHeight: 0, objs: { container: document.querySelector('#scroll-section-1') } }, //2 { type: 'sticky', heightNum: 5, // 브라우저 높이의 5배로 scrollHeight 세팅 scrollHeight: 0, objs: { container: document.querySelector('#scroll-section-2'), messageA: document.querySelector('#scroll-section-2 .a'), messageB: document.querySelector('#scroll-section-2 .b'), messageC: document.querySelector('#scroll-section-2 .c'), pinB: document.querySelector('#scroll-section-2 .b .pin'), pinC: document.querySelector('#scroll-section-2 .c .pin'), canvas: document.querySelector('#video-canvas-1'), context: document.querySelector('#video-canvas-1').getContext('2d'), videoImages: [] }, values: { videoImageCount: 960, imageSequenc: [0, 959], canvas_opacity: [1, 0, { start: 0.9, end: 1}], messageA_translateY_in: [20, 0, { start: 0.15, end: 0.2 }], messageB_translateY_in: [30, 0, { start: 0.6, end: 0.65 }], messageC_translateY_in: [30, 0, { start: 0.87, end: 0.92 }], messageA_opacity_in: [0, 1, { start: 0.25, end: 0.3 }], messageB_opacity_in: [0, 1, { start: 0.6, end: 0.65 }], messageC_opacity_in: [0, 1, { start: 0.87, end: 0.92 }], messageA_translateY_out: [0, -20, { start: 0.4, end: 0.45 }], messageB_translateY_out: [0, -20, { start: 0.68, end: 0.73 }], messageC_translateY_out: [0, -20, { start: 0.95, end: 1 }], messageA_opacity_out: [1, 0, { start: 0.4, end: 0.45 }], messageB_opacity_out: [1, 0, { start: 0.68, end: 0.73 }], messageC_opacity_out: [1, 0, { start: 0.95, end: 1 }], pinB_scaleY: [0.5, 1, { start: 0.6, end: 0.65 }], pinC_scaleY: [0.5, 1, { start: 0.87, end: 0.92 }] } }, //3 { type: 'sticky', heightNum: 5, // 브라우저 높이의 5배로 scrollHeight 세팅 scrollHeight: 0, objs: { container: document.querySelector('#scroll-section-3'), canvasCaption: document.querySelector('.canvas-caption') }, values: { } } ]; function setCanvasImages() { let imgElem; for (let i = 0; i < sceneInfo[0].values.videoImageCount; i++) { imgElem = new Image(); // imgElem = document.createElement('img'); imgElem.src = `./video/001/IMG_${6726 + i}.JPG`; sceneInfo[0].objs.videoImages.push(imgElem); } let imgElem2; for (let i = 0; i < sceneInfo[2].values.videoImageCount; i++) { imgElem2 = new Image(); imgElem2.src = `./video/002/IMG_${7027 + i}.JPG`; sceneInfo[2].objs.videoImages.push(imgElem2); } } function setLayout() { // 각 스크롤 섹션의 높이 세팅 for (let i = 0; i < sceneInfo.length; i++) { if (sceneInfo[i].type === 'sticky') { sceneInfo[i].scrollHeight = sceneInfo[i].heightNum * window.innerHeight; } else if (sceneInfo[i].type === 'normal') { sceneInfo[i].scrollHeight = sceneInfo[i].objs.container.offsetHeight; } sceneInfo[i].objs.container.style.height = `${sceneInfo[i].scrollHeight}px`; } // 새로고침 해도 씬이 고정되게 세팅 yOffset = window.pageYOffset; let totalScrollHeight = 0; for (let i = 0; i < sceneInfo.length; i++) { totalScrollHeight += sceneInfo[i].scrollHeight; if(totalScrollHeight >= yOffset) { currentScene = i; break; } } document.body.setAttribute('id', `show-scene-${currentScene}`); const heightRatio = window.innerHeight / 1080; // 디바이스 높이에 따라 이미지 조정 sceneInfo[0].objs.canvas.style.transform = `translate3d(-50%, -50%, 0) scale(${heightRatio})`; sceneInfo[2].objs.canvas.style.transform = `translate3d(-50%, -50%, 0) scale(${heightRatio})`; // translate3d로 가운데 정렬 후 scale로 이미지 크기 조정 } function calcValues(values, currentYOffset) { let rv; // 현재 씬(스크롤섹션)에서 스크롤 된 범위를 0~1 사이의 비율로 구하기 const scrollHeight = sceneInfo[currentScene].scrollHeight; const scrollRatio = currentYOffset / scrollHeight; if (values.length === 3) { // start ~ end 사이에 애니메이션 실행 const partScrollStart = values[2].start * scrollHeight; const partScrollEnd = values[2].end * scrollHeight; const partScrollHeight = partScrollEnd - partScrollStart; if(currentYOffset >= partScrollStart && currentYOffset <= partScrollEnd) { rv = (currentYOffset - partScrollStart) / partScrollHeight * (values[1] - values[0]) + values[0]; } else if (currentYOffset < partScrollStart) { rv = values[0]; } else if (currentYOffset > partScrollEnd) { rv = values[1]; } } else { rv = scrollRatio * (values[1] - values[0]) + values[0]; } return rv; } function playAnimation() { const objs = sceneInfo[currentScene].objs; const values = sceneInfo[currentScene].values; const currentYOffset = yOffset - prevScrollHeight; // 현재 씬에서 얼만큼 스크롤했는지를 확인 const scrollHeight = sceneInfo[currentScene].scrollHeight; // const scrollRatio = yOffset / 현재 씬의 scrollHeight; const scrollRatio = currentYOffset / scrollHeight; switch (currentScene) { case 0: // console.log('0 play'); let sequence = Math.round(calcValues(values.imageSequenc, currentYOffset)); objs.context.drawImage(objs.videoImages[sequence], 0, 0); objs.canvas.style.opacity = calcValues(values.canvas_opacity, currentYOffset); if (scrollRatio <= 0.22) { // in objs.messageA.style.opacity = calcValues(values.messageA_opacity_in, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageA.style.opacity = calcValues(values.messageA_opacity_out, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.42) { // in objs.messageB.style.opacity = calcValues(values.messageB_opacity_in, currentYOffset); objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageB.style.opacity = calcValues(values.messageB_opacity_out, currentYOffset); objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.62) { // in objs.messageC.style.opacity = calcValues(values.messageC_opacity_in, currentYOffset); objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageC.style.opacity = calcValues(values.messageC_opacity_out, currentYOffset); objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.82) { // in objs.messageD.style.opacity = calcValues(values.messageD_opacity_in, currentYOffset); objs.messageD.style.transform = `translate3d(0, ${calcValues(values.messageD_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageD.style.opacity = calcValues(values.messageD_opacity_out, currentYOffset); objs.messageD.style.transform = `translate3d(0, ${calcValues(values.messageD_translateY_out, currentYOffset)}%, 0)`; } break; case 2: // console.log('2 play'); let sequence2 = Math.round(calcValues(values.imageSequenc, currentYOffset)); objs.context.drawImage(objs.videoImages[sequence2], 0, 0); if (scrollRatio <= 0.32) { // in objs.messageA.style.opacity = calcValues(values.messageA_opacity_in, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageA.style.opacity = calcValues(values.messageA_opacity_out, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.67) { // in objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_in, currentYOffset)}%, 0)`; objs.messageB.style.opacity = calcValues(values.messageB_opacity_in, currentYOffset); objs.pinB.style.transform = `scaleY(${calcValues(values.pinB_scaleY, currentYOffset)})`; } else { // out objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_out, currentYOffset)}%, 0)`; objs.messageB.style.opacity = calcValues(values.messageB_opacity_out, currentYOffset); objs.pinB.style.transform = `scaleY(${calcValues(values.pinB_scaleY, currentYOffset)})`; } if (scrollRatio <= 0.93) { // in objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_in, currentYOffset)}%, 0)`; objs.messageC.style.opacity = calcValues(values.messageC_opacity_in, currentYOffset); objs.pinC.style.transform = `scaleY(${calcValues(values.pinC_scaleY, currentYOffset)})`; } else { // out objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_out, currentYOffset)}%, 0)`; objs.messageC.style.opacity = calcValues(values.messageC_opacity_out, currentYOffset); objs.pinC.style.transform = `scaleY(${calcValues(values.pinC_scaleY, currentYOffset)})`; } break; case 3: // console.log('3 play'); break; } } function scrollLoop() { enterNewScene = false; prevScrollHeight = 0; for (let i = 0; i < currentScene; i++) { prevScrollHeight += sceneInfo[i].scrollHeight; } if (yOffset > prevScrollHeight + sceneInfo[currentScene].scrollHeight) { enterNewScene = true; currentScene ++; document.body.setAttribute('id', `show-scene-${currentScene}`); } if (yOffset < prevScrollHeight) { enterNewScene = true; if(currentScene === 0) return; // 브라우저 바운스 효과로 인해 마이너스가 되는 것을 방지 (모바일) currentScene --; document.body.setAttribute('id', `show-scene-${currentScene}`); } if (enterNewScene) return; playAnimation(); } window.addEventListener('scroll', () => { yOffset = window.pageYOffset; scrollLoop(); }); // window.addEventListener('DOMcontentLoaded', setLayout) 이미지가 업로드 되기 전에 실행 window.addEventListener('load', () => { setLayout(); sceneInfo[0].objs.context.drawImage(sceneInfo[0].objs.videoImages[0], 0, 0); }); window.addEventListener('resize', setLayout); setCanvasImages(); })();
-
애플 웹사이트 인터랙션 클론!
안녕하세요 에러가 나오는데 어떻게 해결해야되나요?
삭제된 글입니다
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 쇼핑몰 사이트 만들기[전체 리뉴얼]
Mongodb
Mongo db 와 연결이 안되는지 npm run dev 를 입력하면 에러가 나는데 어떻게해야하나요ㅠㅠ
-
미해결[OpenCV] 파이썬 딥러닝 영상처리 프로젝트 2 - 불량사과를 찾아라!
소스코드는 어디서 다운로드 받나요?
소스코드는 어디서 다운로드 받나요?
-
미해결비전공자를 위한 개발자 취업 개론
데이터사이언티스트
안녕하세요~ 강의를 듣다가 궁금해서 글을 올려봅니다~ 데이터사이언티스트와 빅데이터 쪽은 다른건가요?? 강의에서 반년정도 공부하면 데이터 사이언티스트가 가능하다고 하셨는데 빅데이터쪽은 신입을 거의 안뽑는걸로 알고 있어서요 ~ 그리고 강의 들으면서 차근차근 알아가서 너무 좋습니다! 너무 많은 양의 정보들이 있어 뭐가 맞고 그른지 알 수 없었는데 선생님 강의를 듣고 명확해지고 있습니다~ 감사합니다^^
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JdbcMemberRepository에서 import 문제
선생님 안녕하세요. 우선 정말 이 수업을 개설해 주셔서 정말정말 감사하다는 말씀 드립니다. 프로젝트 수업으로 스프링 프레임워크에서 스트레스를 엄청 받다가 선생님의 강의를 듣고 한줄기 희망이 생겼습니다!!! 지금 DB 파트 강의에서 순수 JDBC 듣는 중인데, 원래는 오라클 SQL을 사용하려다 import 하는 부분에서 막히길래, 역시 강의와 다른 걸 쓰려니 힘들구나 싶어서ㅜㅜ 우선은 그냥 수업에서 사용하시는 H2로 다시 시도하고 원리를 좀 깨친 다음에 오라클로 재시도 하려 했습니다만.... 결국은 똑같은 곳에서 문제가 생기길래 이렇게 질문을 드립니다. H2에서 DB 생성하고, build.gradle에서 의존성 주입했고, application.properties에 url, driver-class-name까지 설정은 완료한 상태입니다. 그러고나서 JdbcMemberRepository 코드를 작성했는데, 이상하게 이 부분만 import에서 오류가 생깁니다. import org.springframework.jdbc.datasource.DataSourceUtils;(밑줄 친 부분에 오류가 있다고 빨간 줄이 생김) 에러메시지는 "The import org.springframework.jdbc cannot be resolved" 라고 뜨고, 클래스를 새로 생성하라는 식으로만 나오고 있습니다 ㅜㅜ 강제로 실행시키면 다음 메시지가 나옵니다. "Description:Parameter 0 of constructor in hello.hellospring.SpringConfig required a bean of type 'javax.sql.DataSource' that could not be found. The following candidates were found but could not be injected: - Bean method 'dataSource' in 'JndiDataSourceAutoConfiguration' not loaded because @ConditionalOnClass did not find required class 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' - Bean method 'dataSource' in 'XADataSourceAutoConfiguration' not loaded because @ConditionalOnClass did not find required class 'javax.transaction.TransactionManager' Action: Consider revisiting the entries above or defining a bean of type 'javax.sql.DataSource' in your configuration. " 사용 환경은 윈도10 / Eclipse EE / Spring boot 2.3.3. 입니다.수업을 착실히 들었다고 생각했는데 혹시 설정 같은 걸 빼먹은 게 아닌지 싶은데, 구글링해도 답을 얻을 수 없어 여쭤봅니다. 감사합니다 !!
-
미해결[백문이불여일타] 데이터 분석을 위한 고급 SQL
Window 함수를 이용한 누적 합 문의
안녕하세요. 좋은 강의 잘 들었습니다. window 관련한 누적 합 문의 드립니다. 예를들어 A, B, C 모델의 일별 판매량을 누적으로 구하고자 합니다. 1일 : 2개 , 1개, 2개 2일 : 2개 , 2개, 2개 3일 : 0개, 0개, 0개 4일 : 0개, 1개, 2개 각각 A B C의 판매량이 있을때, partition 모델명, order 날짜로 하면 - 중간에 0이 모두 있는 곳 혹은 - A라는 모델만 추출했으때 3일과 4일은 누적합의 리스트에 나오지 않는데.. 이를 해결하기 위한 팁이 있나요? 중간에 판매가 0이라도 전일 누적값이 그대로 출력되어 표현하고 싶습니다.
-
해결됨단 두 장의 문서로 데이터 분석과 시각화 뽀개기
시계열 데이터 전처리 질문입니다.
강사님 replace 설명중에([5/25] 시계열 데이터 전처리4:40) 에 string이 다 일치 하지 않는 다고 설명하셨는데, 자세하게 설명 부탁합니다. 해당 날짜는 전부 object 로 보여지는데, 그렇지 않아서 앞에 str를 붙인다고 하시니 이해가 되지 않아서요. 답변 미리 감사드리고 건강 조심하세요.
-
해결됨리액트로 나만의 블로그 만들기(MERN Stack)
AppNavBar에서 home으로 가는 링크와 Add post 버튼, 로그 아웃버튼에서 에러가 발생합니다
안녕하세요 강사님 AppNavBar에서 버튼을 클릭했을 때 동일한 에러가 발생하여 질문을 올립니다. 아래 사진을 첨부하겠습니다. 예를 들어 post 버튼을 눌렀을 때 아래와 같이 창이 뜨고 새로고침을 하면 정상적으로 글을 작성할 수 있도록 창이 나타납니다 로그아웃을 눌렀을 때 로그아웃이 잘 되지만 다시 다른 버튼을 누르려고 해도 창이 로그아웃 한 상태로 멈춰있습니다. Uncaught Could not find router reducer in state tree, it must be mounted under "router" 이런 에러가 발생을 공통적으로 발생하는데 어디에서 손을 대야할지 잘 모르겠습니다
-
미해결HTML+CSS+JS 포트폴리오 실전 퍼블리싱(시즌1)
button에 hover
안녕하세요! 강의에서 처럼 dorpdown에 hover를 주면 잘 작동하는데 왜 button에 주면 안될까요 ㅠ?
-
미해결3시간이면 충분히 입문자를 벗어날 수 있는 프리미어 프로
자막 쉽고 빠른 툴이 정확하게 뭐죠?
발음이 뭉개져서 알아 듣지 못하겠어요 툴을 알고싶은데 창을 위쪽으로 올려놔서 무슨 툴인지도 안보이고요
-
미해결윤재성의 Node.js 서버 프로그래밍 과정
new -> other -> javascript -> npminit가 없어요 ㅜㅜ
new -> other -> javascript -> npminit가 없어요 ㅜㅜ 어떻게 하면 좋을까요?
-
미해결자바스크립트로 알아보는 함수형 프로그래밍 (ES5)
memo = iter(memo, val)
안녕하세요. 05:00 에서 memo를 계속 덮어쓰는 memo = iter(memo, val) 구문이 처음 실행될 때, 좌변의 memo는 값이 없는 임의의 변수에서 0, 1이 더해진 1이 할당되는 거 맞나요?
-
미해결몇 줄로 끝내는 인터랙티브 웹 개발 노하우 [초급편]
예제파일
강의에서 예제파일보자고 하셨는데 어떻게 받나요?
-
미해결남박사의 파이썬으로 실전 웹사이트 만들기
게속 오류떠요
고쳐도 수용없어요 from flask import Flask from flask import request from flask import render_template from flask_pymongo import PyMongo from bson.objectid import ObjectId from flask import abort from datetime import datetime from flask import redirect from flask import url_for import time import math app = Flask(__name__) app.config["MONGO_URI"] = "mongodb://localhost:27017/myweb" mongo = PyMongo(app) # 메인 @app.route("/") def Main(): Myyy = """ <meta http-equiv="refresh" content="0;url=/list"> """ # return """<meta http-equiv="refresh" content="0;url=/write">""" return Myyy @app.template_filter("formatdatetime") # 시간 def format_datetime(value): if value is None: return " " now_timestamo = time.time() offset = datetime.fromtimestamp(now_timestamo) - datetime.utcfromtimestamp(now_timestamo) value = datetime.fromtimestamp((int(value) / 1000)) + offset return value.strftime('%Y-%m-%d %H:%M:%S') # 년/월/일 시/분/초 @app.route("/list") def lists(): # 중요 # 페이지 값 (값이 없는 경유 기본값은 1) page = request.args.get("page", 1, type=int) # 한페이지당 몇개의 게시물을 출력할지 limit = request.args.get("limit", 7, type=int) # 기본값은 10개이다 수정가능 search = request.args.get("search", - 1, type=int) keyword = request.args.get("keyword", type=str) # 최종적으로 완성된 쿼리를 만글 변수 query = {} # 검색어 상태를 추가할 리스트 변수 search_list = [] if search == 0: search_list.append({"title": {"$regex": keyword}}) elif search == 1: search_list.append({"contents": {"$regex": keyword}}) elif search == 2: search_list.append({"title": {"$regex": keyword}}) search_list.append({"contents": {"$regex": keyword}}) elif search == 3: search_list.append({"name": {"$regex": keyword}}) # 검색 대상이 1개하도 존재할 경우 query 변수 $or 리스트 쿼리 한다 if len(search_list) > 0: query = {"$or": search_list} # {"$and":[ # {"title": {"$regex": "파이썬"}}, # {"title": {"$regex": "파이썬"}}, # {"title": {"$regex": "안드로아드"}}, # ]} print(query) board = mongo.db.board # DB가져오기 datas = board.find(query).skip((page - 1) * limit).limit(limit) # 게시물의 총 갯수 tot_count = board.find(query).count() # 마지막 페이지의 수를 구합니다 last_page_num = math.ceil(tot_count / limit) # 페이지 블럭을 5개씩 표기 block_size = 5 # 변경 가능 # 현재 블럭의 위치 block_num = int((page - 1) / block_size) # 블럭 시작위치 block_start = int((block_size * block_num) + 1) # 블럭의 끝 위치 block_last = math.ceil(block_start + (block_size - 1)) return render_template("list.html", datas=datas, limit=limit, page=page, block_start=block_start, block_last=block_last, last_page_num=last_page_num, search=search, keyword=keyword) @app.route("/view/<idx>") def board_view(idx): # idx = request.args.get("idx") if idx is not None: board = mongo.db.board data = board.find_one({"_id": ObjectId(idx)}) if data is not None: result = { "id": data.get("_id"), "name": data.get("name"), "title": data.get("title"), "contents": data.get("contents"), "pubdate": data.get("pubdate"), "view": data.get("view"), } return render_template("view.html", result=result) return abort(404) @app.route("/write", methods=["GET", "POST"]) def board_write(): if request.method == "POST": name = request.form.get("name") title = request.form.get("title") contents = request.form.get("contents") print(name, title, contents) current_utc_time = round(datetime.utcnow().timestamp() * 1000) board = mongo.db.board post = { "name": name, "title": title, "contents": contents, "pubdate": current_utc_time, "view": 0, } x = board.insert_one(post) print(x.inserted_id) return redirect(url_for("board_view", idx=x.inserted_id)) else: return render_template("write.html") if __name__ == "__main__": app.run(host="0.0.0.0", debug=True, port=8501) html도 고쳐도 여전히 오류떠요 <script> function search() { var val_search = document.getElementById("search").value; var val_keyword = document.getElementById("keyword").value; if(val_search == "" || val_keyword == "") { return false; } else { self.location.href = "{{url_for('lists')}}?search=" + val_search + "&keyword=" + val_keyword; } } </script> {% if datas.count() > 0 %} <title>목록</title> <table> <thead> <tr> <td>번호</td> <td>제목</td> <td>이름</td> <td>날짜</td> <td>조회수</td> </tr> </thead> <tbody> <!--반복되는 구간--> {% for data in datas %} <tr> <td>{{loop.index + ((page - 1) * limit)}}</td> <!--게시물 번호--> <td><a href="{{url_for('board_view', idx=data._id, page=page, search=search, keyword=keyword)}}">{{data.title}}</a></td> <td>{{data.name}}</td> <td>{{data.pubdate | formatdatetime}}</td> <td>{{data.view}}</td> <!-- <td>{{data.title}}</td> <td>{{data.title}}</td> --> </tr> {% endfor %} <!--반복되는 구간 끝--> </tbody> </table> {% if block_start - 1 > 0 %} <a href="{{url_for('lists', page=block_start - 1, search=search, keyword=keyword)}}">[이전]</a> {% endif %} {% for i in range(block_start, block_last + 1) %} {% if i > last_page %} <!-- {{ i }} --> {% else %} {% if i == page %} <b>{{i}}</b> {% else %} <a href="{{url_for('lists', page=i, search=search, keyword=keyword)}}">{{ i }}</a> {% endif %} {% endif %} {% endfor %} {% if block_last < last_page %} <a href="{{url_for('lists', page=block_last + 1, search=search, keyword=keyword)}}">[다음]</a> {% endif %} <select name="search" id="search"> <option value="">검색대상</option> <option value="0">제목</option> <option value="1">내용</option> <option value="2">제목+내용</option> <option value="3">작성자</option> </select> <input type="text" name="keyword" id="keyword" > <input type="button" value="검색" onclick="search()"> {% else %} <h3>테이터가 없습니다</h3> {% endif %}
-
미해결자바 스프링 프레임워크(renew ver.) - 신입 프로그래머를 위한 강좌
프로젝트 import시
lec21pjt001 <--이렇게 나오지 않고 자꾸 lec21로 로드가 되네요 lec21pjt001이 저렇게 로드되니까 lec21pjt002도 lec21로 로드 되려고해서 같은 이름이라고 로드가 안됩니다
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
ffmpeg 관련
안녕하세요 강사님, 리액트 강의 잘 듣고 있습니다! 다름이 아니라 윈도우용 ffmpeg를 다운로드 하려고 홈페이지에 접속하니 9월 18일에 종료된다는 안내문구가 써있더라구요 ffmpeg가 종료되어도 수업을 계속 진행하기에는 지장이 없는걸까요? 9월 18일 안에 이 수업을 다 수강하지 못할 것 같아서요ㅎㅎ
-
미해결파이썬 라즈베리파이 IoT프로젝트-원격모니터링 자동차
질문
etcher에서 플래시가 실패됬다고 뜨는데, 어떻게 해결할 수 있나요?
-
미해결플러터와 장고로 1시간만에 퀴즈 앱/서버 만들기 [무작정 풀스택]
image upload 오류
pubspec.yaml에 로드 잘 입력해주었는데 애뮬레이터 실행시 이런 오류가 뜹니다. 확인 부탁드립니다.
-
미해결화이트해커가 되기 위한 8가지 웹 해킹 기술
;id를 입력하면 아무것도 나오지 않습니다. 정상인가요?
영상처럼 medium 단계에서 ;id를 입력하면 아무것도 나오지 않습니다. &id는 정상적으로 출력됩니다.