묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결부트스트랩 5(Bootstrap 5) - 기초부터 웹 프로젝트 만들기
trandsform translateY
trandsform translateY transition ease 어떤 기능인가요?
-
미해결React 기반 Gatsby로 기술 블로그 개발하기
develop 은 되는데 build 환경에서의 오류
Building static HTML failed for path "/main/postItem/" See our docs page for more info on this error: https://gatsby.dev/debug-html 19 | categories, 20 | summary, > 21 | thumbnail: { publicURL }, | ^ 22 | link, 23 | }) => { 24 | return ( WebpackError: TypeError: Cannot read properties of undefined (reading 'publicURL') - postItem.tsx:21 gatsby-starter-default/src/pages/main/postItem.tsx:21:16 - inheritsLoose.js:5 [gatsby-starter-default]/[@babel]/runtime/helpers/inheritsLoose.js:5:1 - emotion-is-prop-valid.esm.js:15 [gatsby-starter-default]/[@emotion]/is-prop-valid/dist/emotion-is-prop-valid.esm.js:15:1 - inheritsLoose.js:7 [gatsby-starter-default]/[@babel]/runtime/helpers/inheritsLoose.js:7:1 - static-entry.js:294 gatsby-starter-default/.cache/static-entry.js:294:22 - history.js:49 [gatsby-starter-default]/[@gatsbyjs]/reach-router/es/lib/history.js:49:6 publicUrl 이 없으면 build 환경에서 잘 동작합니다. 저 구문만 있으면 build 환경에서 돌아가지 않습니다..! https://github.com/urther/example 레포 주소 첨부합니다 ㅠㅠ 8000/graphql 에서 publicUrl 정상 동작하는것도 확인했습니다!
-
미해결스프링 핵심 원리 - 기본편
AppConfig와 DIP에 관한 질문
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요. 제가 궁금한 부분은 이 main메서드에서 memberService가 AppConfig클래스에 의존한다고 생각이 드는데, 현재강의 까지만 들었을 때 시점으로 본다면, main메서드 내에서 memberService = appConfig.memberService(); 이 부분을 어떻게 보는 것이 좋을 지와 DIP를 위반하고 있는 것이 맞는가? 라는 질문에 대한 답입니다. 물론 관심사의 분리를 위해 의존관계 설정 클래스로 설정해서 활용한다는 것은 이해하지만, 구현체를 참조한 것이 아니니까 DIP위반은 아닌 상관없는 것으로 봐야 할지, 아니면 이 역시 클래스 내에서 타 클래스의 메서드를 참조하는 것이니까 의존이라고 볼 수 있지만, 분리를 위해 어쩔 수 없는 것이라고 봐야할지 어떻게 생각하는게 좋을지 모르겠습니다.
-
미해결Do it! 자바 프로그래밍 입문 with 은종쌤
catch로 예외처리할때 최상위인 Exception만 쓰면 안되나요??
이렇게 파일낫파운드랑 클래스낫파운드 주석처리 해놓고 Exception만 해줘도 파일 없을때랑 클래스 없을때 다 잡는데 왜 따로 나눠서 잡아줘야하나요?
-
미해결따라하면서 배우는 웹애플리케이션 만들기
localhost8080/index.html 질문이요
선생님 localhost8080/index.html을 했는데 bitnami 홈페이지가 나오네요? 그런데 파일 경로는 /Applications/mampstack-8.1.4-0/apache2/htdocs에 index.html로 저장했어요. 왜 그런것인가요? 이 파일을 열면 웹주소가file://application/mampstack-8.1.4-0/apache2/htdocs/index.html 로 떠요
-
미해결[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
build_dataset( )호출 시 리스트로 감싸지 않는 것에 대하여
코로나에 확진이 되셨다고 들었습니다 ㅜㅜ 저도 한 달 전에 확진되었는데 몸조리 잘 하시기 바랍니다. 천천히 답변해주셔도 됩니다. 먼저 남겨놓겠습니다 ㅠㅠ 질문: build_dataset( )호출 시 리스트로 감싸지 않는 것이 훈련과 테스트용에서 서로 달랐습니다. 테스트용에서는 리스트로 감싸지 않았는데요, 이유를 알 수 있을까요? 쾌유를 빌겠습니다!
-
미해결스프링 배치
이런 내용을 다룬 부분이 강의에 있는지 궁금합니다.
안녕하세요. 실무에서 스프링 배치를 사용하고 있는데요. 차근차근 강의를 정주행하려고 구매 했었으나, 일정의 압박으로 필요한 부분만 발췌해서 듣고 있습니다. (그럼에도 많은 도움을 받았습니다. 감사합니다 :) 배치를 사용하며 궁금증이 생긴 부분이 있는데요. 예를 들어 Job A가 Step1, Step2로 구성되어 있고 각 Step의 Reader는 JdbcPagingItemReader를 사용한다고 했을 때, Step2의 특정 Chunk에서 Job이 실패한 뒤 재실행 하면 성공한 Step1 및 Step2의 Chunk들은 건너 뛰고 실패한 지점부터 재시작하게 되는데요. 이 과정이 어떻게 수행되는지 분석, 학습을 해보고 싶습니다. 혹시 해당 강의에 이 내용을 다룬 부분이 있을까요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
질문이 있습니다.
다름이아니라 질문이 있습니다. 제가 그 AWS말고 개인적으로 포트포워딩해서 핸드폰으로 접속하면서 테스트를 해보고있는데 (내부ip로컬서버환경도 동일) 외부접속이 아닌 로컬로 할때도 그렇고 그 프론트에서 백엔드 포트쪽으로 요청을 보낼때 응답이 오기까지의 딜레이가 랜덤인 것 같아요... 다시 프론트 응답로딩까지 오래 걸리는 것같은느낌? 그럴때마다 백엔트 포트 실행시킨 터미널쪽에서 엔터키를 누르면 바로 터미널 로그에 시퀄라이즈 쿼리문이 찍히면서 응답이 오는데 왜 그런건가요? 이유를 알고 싶네요 질문 1. 프론트에서 백엔드로 요청을보낼떄 응답하는 속도가 랜덤인 것 같다(어쩔땐 빠르고 어쩔땐 느린...) 질문2. 그럴때마다 백엔드 터미널에서 엔터키를 치는데 프론트에서 백으로 요청보내고 바로 엔터키를 치면 바로 요청->응답 페이지 로딩 되는데 이부분 관련해서 왜 엔터키를 치면 바로 요청 된 값이 응답이 되는가에 대해 궁금하네요 질문3 아 그리고 제가 외부ip 내부 ip로 로그인 관련 테스트 해본결과 같은 아이디로 로그인 되더라구요 이 부분 관련해서 코딩을 안해줘서 당연하지만 예상을 해보면 여기에서 다루는 전략은 세션에서 아이디 값을 가지고있는게 아니라 프론트에서 쿠키로 가지고 있잖아요? 그럼 쿠키에 같은 값이 왔을때 뭐 어떻게 처리해줘야할 것같은데 AWS 배포 강의 부분을 아직 다 보지 못했는데 거기 설명해주시면서 알려주시나요? 만약 그 내용이 없다면 구글에 키워드를 뭐라고 치면 나올까요?
-
미해결윤재성의 스프링 프레임워크 개발자를 위한 실습을 통한 입문 과정
질문드립니다.
<bean id="t1" class="kr.co.softcampus.beans.TestBean1" lazy-init="true" init-method="bean1_init" destroy-method="bean1_destroy" scope="prototype" /> 해당내용으로 beans.xml 설정 후 ctx.close( ); 를 호출하면, bean1_destroy메서드는 호출이 안되는것으로 확인되는데 왜그럴까요! 싱글톤일땐 정상호출 되지만, 프로토타입으로하니깐 각각 객체 생성되어, init메서드는 정상호출이되고 destroy메서드만 호출이안되서 질의드립니다.
-
미해결실전! 스프링 데이터 JPA
낙관적인 락
안녕하세요 영한님! 간단하게 비관적인 락과 낙관적인 락 예시에 대해 궁금한게 있습니다. 비관적인 락 같은 경우에는 동시에 많은 요청이 들어와서 모두 카운트해서 올려야하는 조회수 같은 곳에 사용한다고 구글링을 해보니 나오는데 낙관적인 락을 사용하는 예시는 찾을 수 없어서 혹시 실무에서 낙관적인 락을 사용하는 사례는 어떤게 있을 까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
강의교안 오탈자
알고리즘 교안에서 오타를 발견했습니다. find(v.begin(), v.end(), 0);으로 나와야 합니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
useCallback 배열 질문
안녕하세요 제로초님, useinput과 export default (initialValue = null) => { const [value, setValue] = useState(initialValue) const handler = useCallback((e) => { setValue(e.target.value); }, [여기]); return [value, handler]; } 이번 강의에서 사용하신 useCallback 함수 const onChangeText = useCallback((e) => { setText(e.target.value) }, [여기]); 내부에 있는 배열에 useinput에는 value, onChangeText에는 text를 넣지 않아도 되는건가요? 사용자가 입력할 때 마다 어차피 컴포넌트가 리렌더링 되니까 넣어도 안넣어도 똑같기 때문에 굳이 넣지 않는 것인가요?
-
미해결따라하면서 배우는 웹애플리케이션 만들기
맥북 서버 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하안녕하세요 html 처음배웁니다. 혹시 맥북으로 서버 설치는 어떻게 해야할까요 ? mac으로 따라해야 할까요?기를 이용해주세요.
-
미해결홍정모의 따라하며 배우는 C++
지역변수의 중단점이 안보일경우
배열과 반복문 강의 듣는겸 따로 봐왔던 코드를 따라 해보는겸 코드를 짜고 잇는데요 제 의도 대로 되지 않아서 중단점을 통해서 배열이 어떻게 채워지는지 보고싶어 중단점을 정하고 디버깅을 하는데 지역 변수 인 부분인 배열이 중단점에서 안보이더라구요 ㅠ 구글링해서 optimization을 Disabled 해도 안되더라구요 배열을 중단점에서 어떻게 확인 할수 있을까요?? 버젼은 Visual Studio Community 2019 - Version 16.11.2 입니다!
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
이렇게 한것도 괜찮나요
안녕하세요 선생님 이렇게 했는데 괜찮나요 function solution(str){ let haha= str.replace(/[a-z]/gi, "").replace(/(^0+)/, ""); return haha ; } let str="g0000en2T0sfdjsifjwep0if32uufklnfwfe8eSoft"; console.log(solution(str));
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
generate_view_fn 함수 질문
안녕하세요 일급함수와 관련해서 generate_view_fn 함수를 설명해주셨는데, return 값에서 instance_name은 template에 넘겨주기 위한 변수이름으로 활용되는 건가요? 설명에서는 위에 view_fn함수에 있는 instance_name과 같다고 하셨는데 헷갈려서 질문 남깁니다!! 감사합니다
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 영화 사이트 만들기
node 버전을 다운 그레이드 시켜야하나요?
현재 제가 가진 노드 버전(v16.14.1)이랑 bcrypt 라이브러리 버전(v3.0.6)이 안맞아서 관련 에러가 발생하고 있습니다 . (에러 메시지에서 요구하는 사항은 bcrypt 버전을 v3.0.8로 변경하라고 하는 것 같습니다.) 강의를 따라가려면 root 의 package.json 안에 engines의 값으로 node, npm 버전이 적혀있는데 저 버전으로 nvm을 이용해서 다운 그레이드 해야하는 건지 아니면 에러 메시지에 맞춰 라이브러리를 업그레이드 해야하는지 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
lombok cannot find symbol 오류
스프링 부트 : 2.6.5 자바 : 11 현재 상태 : 컴파일러 설정 : 어노테이션 활성화 lombok 설치상태 : build.gradle 상태 : 프로젝트 외부 라이브러리 상태 : 프로젝트 설정 상태 : 오류 내용 : 혼자서 해결해 보려고 구글링을 통한 여러가지 방법을 시도해 보았지만 결국 다 실패하고 질문 올립니다...
-
해결됨남박사의 파이썬으로 실전 웹사이트 만들기
오류 나는 부분이 있어서 다시 질문 드립니다! 도와주세요! (join 로그인시 백지, 몽고db 이메일주소 null 표시)
안녕하세요 웹개발 입문부분 강좌를 거의다 들었는데.. 오류가 나는 부분이 있어서.. 질문을 올립니다! 문제는..join 로그인 하면 몽고db에서 이메일 주소가 null로 표시가 되서.. 동작이 되지 않는점이 있습니다.. 비슷한 증상을 찾기 어려워서 질문 남깁니다! -화면- -join- -mongoDB- -list- -list 로그인 페이지- next_url << 이게 문제가 나왔었는데 다른 코드들 참고 했는데 해결은 됬습니다. -run.py- 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 flask import redirect from flask import url_for from flask import flash from flask import session from functools import wraps import math import time from datetime import datetime, timedelta app = Flask(__name__) app.config["MONGO_URI"] = "mongodb://localhost:27017/myweb" app.config["SECRET_KEY"] = "abcd" app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(minutes=30) mongo = PyMongo(app) def login_required(f): @wraps(f) def decorated_function(*args, **kwargs): if session.get("id") is None or session.get("id") == "": return redirect(url_for("member_login", next_url=request.url)) return f(*args, **kwargs) return decorated_function @app.template_filter('formatdatetime') def format_datetime(value): if value is None: return "" now_timestamp = time.time() offset = datetime.fromtimestamp( now_timestamp) - datetime.utcfromtimestamp(now_timestamp) 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", 5, type=int) 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}}) # 검색 대상이 한개라도 존재할 경우 query 변수에 $or 리스트를 쿼리 합니다. if len(search_list) > 0: query = {"$or": search_list} print(query) board = mongo.db.board datas = board.find({}).skip((page - 1) * limit).limit(limit) # 게시물의 총 갯수 tot_count = board.count_documents({}) # 마지막 페이지의 수를 구한다. 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=list(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>") @login_required def board_view(idx): # idx = request.args.get("idx") if idx is not None: page = request.args.get("page") search = request.args.get("search") keyword = request.args.get("keyword") board = mongo.db.board # data = board.find_one({"_id": ObjectId(idx)}) data = board.find_one_and_update({"_id": ObjectId(idx)}, { "$inc": {"view": 1}}, return_document=True) 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"), "writer_id": data.get("writer_id", "") } return render_template("view.html", result=result, page=page, search=search, keyword=keyword) return abort(404) @ app.route("/write", methods=["GET", "POST"]) def board_write(): if session.get("id") is None: return redirect(url_for("member_login")) 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, "writer_id": session.get("id"), "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") @app.route("/join", methods=["GET", "POST"]) def member_join(): if request.method == "POST": name = request.form.get("name", type=str) email = request.form.get("email", type=str) pass1 = request.form.get("pass", type=str) pass2 = request.form.get("pass2", type=str) if name == "" or email == "" or pass1 == "" or pass2 == "": flash("입력되지 않은 값이 있습니다.") return render_template("join.html") if pass1 != pass2: flash("비밀번호가 일치하지 않습니다.") return render_template("join.html") members = mongo.db.members cnt = members.count_documents({"email": email}) if cnt > 0: flash("중복된 이메일 주소입니다.") return render_template("join.html") current_utc_time = round(datetime.utcnow().timestamp() * 1000) post = { "name": name, "email": email, "pass": pass1, "joindate": current_utc_time, "logintime": "", "logincount": 0, } members.insert_one(post) return "" else: return render_template("join.html") @app.route("/login", methods=["GET", "POST"]) def member_login(): if request.method == "POST": email = request.form.get("email") password = request.form.get("pass") next_url = request.form.get("next_url") members = mongo.db.members data = members.find_one({"email": email}) if data is None: flash("회원 정보가 없습니다.") return redirect(url_for("member_login")) else: if data.get("pass") == password: session["email"] = email session["name"] = data.get("name") session["id"] = str(data.get("_id")) session.permanent = True if next_url is not None: return redirect(next_url) else: return redirect(url_for("lists")) return redirect(url_for("lists")) else: flash("비밀번호가 일치하지 않습니다.") return redirect(url_for("member_login")) return "" else: next_url = request.args.get("next_url", type=str) if next_url is not None: return render_template("login.html", next_url=next_url) else: return render_template("login.html") @app.route("/edit/<idx>", methods=["GET", "POST"]) def board_edit(idx): if request.method == "GET": board = mongo.db.board data = board.find_one({"_id": ObjectId(idx)}) if data in None: flash("해당 게시물이 존재하지 않습니다.") return redirect(url_for("lists")) else: if session.get("id") == data.get("writer_id"): return render_template("edit.html", data=data) else: flash("글 수정 권한이 없습니다.") return redirect(url_for("lists")) else: title = request.form.get("title") contains = request.form.get("contents") board = mongo.db.board data = board.find_one({"_id": ObjectId(idx)}) if session.get("id") == data.get("writer_id"): board.update_one({"_id": ObjectId(idx)}, { "$set": { "title": title, "contents": contains, } }) flash("수정 되었습니다.") return redirect(url_for("board_view", idx=idx)) else: flash("글 수정 권한이 없습니다.") return redirect(url_for("lists")) @app.route("/delete/<idx>") def board_delete(idx): return "" if __name__ == "__main__": app.run(host="0.0.0.0", debug=True, port=9000) ------------------------------------------------------------------------------------------------ -join- {% with messages = get_flashed_messages() %} {% if messages %} <script> alert('{{messages[-1]}}'); </script> {% endif %} {% endwith %} <table> <form name="form" action="/join" method="POST"> <thead> <caption>회원가입</caption> </thead> <tbody> <tr> <td>이름</td> <td><input type="text" name="name"></td> </tr> <tr> <td>이메일</td> <td><input type="text" nmae="email"></td> </tr> <tr> <td>비밀번호</td> <td><input type="password" name="pass"></td> </tr> <tr> <td>비밀번호 확인</td> <td><input type="password" name="pass2"></td> </tr> <tr> <td colspan="2"><input type="submit" value="가입하기"></td> </tr> </tbody> </form> </table> ---------------------------------------------------------------------------------------------------------- -login- {% with messages = get_flashed_messages() %} {% if messages %} <script> alert("{{messages[-1]}}"); </script> {% endif %} {% endwith %} <table> <form name="form" action="/login" method="POST"> {% if next_url %} <input type="hidden" name="next_url" value="{{next_url}}" /> {% endif %} <thead> <caption> 회원 로그인 </caption> </thead> <tbody> <tr> <td>이메일</td> <td><input type="text" name="email" /></td> </tr> <tr> <td>비밀번호</td> <td><input type="password" name="pass" /></td> </tr> <tr> <td colspan="2"><input type="submit" value="로그인" /></td> </tr> </tbody> </form> </table> -------------------------------------------------------------------------------------------------------- - list - {% with messages = get_flashed_messages() %} {% if messages %} <script> alert('{{messages[-1]}}'); </script> {% endif %} {% endwith %} <script> function search() { var v_search = document.getElementById("search").value; var v_keyword = document.getElementById("keyword").value; if (v_search == "" || v_keyword == "") { return false; } else { self.location.href = "{{url_for('lists')}}?search=" + v_search + "&keyword=" + v_keyword; } } </script> {% if datas|length > 0 %} <table> <thead> <tr> <td>번호</td> <td>제목</td> <td>이름</td> <td>날짜</td> <td>조회수</td> </tr> </thead> <tbody> <!--반복되는 구간--> <tr> {% for data in datas %} <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> </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_num %} {{ 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_num %} <a href="{{url_for('lists', page=block_last + 1, search=search, keyword=keyword)}}">[다음]</a> {% endif %} <select name="search" id="search"> <option value="" {% if search=='' or search==-1 %} selected {% endif %}>검색대상</option> <option value="0" {% if search==0 %} selected {% endif %}>제목</option> <option value="1" {% if search==1 %} selected {% endif %}>내용</option> <option value="2" {% if search==2 %} selected {% endif %}>제목+내용</option> <option value="3" {% if search==3 %} selected {% endif %}>작성자</option> </select> <input type="text" name="keyword" id="keyword" {% if keyword !="" %} value="{{keyword}}" {% endif %} /> <input type="button" value="검색" onclick="search()" /> {% else %} <h3>데이터가 없습니다.</h3> {% endif %} <a href="{{url_for('board_write')}}">글작성</a> ------------------------------------------------------------------------------------------------------- - edit - <html> <body> <table> <form name="form" method="post" action="/edit/{{data._id}}"> <tr> <td>작성자</td> <td><input type="text" name="name" value="{{session['name']}}" readonly /></td> </tr> <tr> <td>제목</td> <td><input type="text" name="title" /></td> </tr> <tr> <td>내용</td> <td><textarea type="text" name="contents">{{data.contents}}</textarea></td> </tr> <tr> <td colspan="2"><input type="submit" /></td> </tr> </form> </table> </body> </html>
-
미해결쉽게 처음하는 파이썬 고급 크롤링 [Scrapy, Selenium, Headless Chrome]
json 으로 저장이 안되네요
File "/Users/hwan/Library/CloudStorage/OneDrive-개인/Coding/scrapy/mynaverapi/mynaverapi/spiders/navershopapi.py", line 23, in parse data = json.loads(response.body_as_unicode()) AttributeError: 'TextResponse' object has no attribute 'body_as_unicode' 이와 같은 문구가 나오면서 정상적으로 작동하지 않네요 ... pip install json 을 입력하면 아래와 같은 메세지가 나옵니다. 어떻게 하면 해결할 수 있을까요? ERROR: Could not find a version that satisfies the requirement json (from versions: none) ERROR: No matching distribution found for json