我的Blog搭建之旅4——搭建实例

本文详细介绍了如何使用React与Django搭建博客系统,重点讲解了跨域问题的解决方法,包括Ajax的基本原理、React前端组件的构建、Django后端视图的配置及Nginx的部署。

我的Blog搭建之旅4——搭建实例

== 2019.2.14 ===

今天的目的是融合react和Django,实现一个简单的前后端交互的小例子

Ajax

  • 什么是ajax:异步的JS和XML???
AJAX 是一种用于创建快速动态网页的技术。

通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。
  • Ajax实例:

    function loadXMLDoc()
    {
        //创建对象
    	var xmlhttp;
    	xmlhttp=new XMLHttpRequest();
        
    	xmlhttp.onreadystatechange=function()
    	{
            //如果获取到了响应
    		if (xmlhttp.readyState==4 && xmlhttp.status==200)
    		{
          //获取响应信息
                document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    		}
    	}
        //具体的发送请求操作,先打开后发送
    	xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);
    	xmlhttp.send();
    }
    
  • 发送请求

  • 方法描述
    open(method,url,async)规定请求的类型、URL 以及是否异步处理请求。
    method:请求的类型;GET 或 POST
    url:文件在服务器上的位置
    async:true(异步)或 false(同步)
    send(string)将请求发送到服务器。
    string:仅用于 POST 请求
    setRequestHeader(header,value)向请求添加 HTTP 头。
    header: 规定头的名称
    value: 规定头的值
  • 获得响应:

  • 属性描述
    responseText获得字符串形式的响应数据。
    responseXML获得 XML 形式的响应数据。
  • readyState状态:

    属性描述
    onreadystatechange存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
    readyState存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。0: 请求未初始化1: 服务器连接已建立2: 请求已接收3: 请求处理中4: 请求已完成,且响应已就绪
    status200: “OK” 404: 未找到页面
  • 什么是异步?

    • XMLHttpRequest 对象如果要用于 AJAX 的话,其 open() 方法的 async 参数必须设置为 true
    • 通过 AJAX,JavaScript 无需等待服务器的响应,而是:
      • 在等待服务器响应时执行其他脚本
      • 当响应就绪后对响应进行处理

React的处理

主要参考的博客是:https://www.jianshu.com/p/f59f7a7bf07d

  • 首先还是照常编辑一个简单的JS页面,将上面的Ajax编辑进去,利用Json传递POST请求

    import React from 'react';
    import ReactDOM from 'react-dom';
    
    class Login extends React.Component {
      render() {
        return (
           <div>
                <h2>请输入宝宝的信息</h2>
                 <form id="myDiv">
                     姓名:<input type="text" name="name" id="name1"/><br />
                     性别:<input type="radio"  name="sex" value="男" defaultChecked="checked" />男士
                     <input type="radio"  name="sex" value="女"/>女士<br />
                     年龄:<input type="text" name="age" id="age"/><br />
                     <button type="button" onClick={this.loadXMLDoc}>提交数据</button>
                 </form>
              </div>
        );
      }
      loadXMLDoc(){
        let xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange=function(){
          if (xmlhttp.readyState ===4 && xmlhttp.status ===200){
            document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
          }
        };
      //获取用户填写的信息
        let name = document.getElementById("name1").value;
        //利用querySelectorAll找到所有radionuclide,遍历其boolean从而筛选除有效的值。
        function findsex(){
          for (let i of document.querySelectorAll("input[type='radio']")) {
              if (i.checked === true) {
                  return i.value
              }
          }
        };
      let sex =findsex()
      console.log("sex:",sex);
      let age = document.getElementById("age").value;
    
      //这里是封装发送
      let jsoned = JSON.stringify({"name":name,"sex":sex,"age":age});
      console.log("============",jsoned);
      xmlhttp.open("POST","http://127.0.0.1:8000/server/AjaxLoad/",true);
      xmlhttp.setRequestHeader("Content-type","application/json");
      xmlhttp.send(jsoned);
    }
    }
    
    //=========================================================
    ReactDOM.render(
      <Login />,
      document.getElementById('root')
    );
    
  • 我们接下来需要运行的命令是

    npm run build
    

    这个命令的作用是将你写的React打包起来可以应用,最后的目录如下:

    zhangyunzhedeMacBook-Air:build listener$ tree .
    .
    ├── asset-manifest.json
    ├── favicon.ico
    ├── index.html
    ├── manifest.json
    ├── precache-manifest.48b4d8527db511ced977333fd66c9b7a.js
    ├── service-worker.js
    └── static
        └── js
            ├── 2.c086a725.chunk.js
            ├── 2.c086a725.chunk.js.map
            ├── main.05eae418.chunk.js
            ├── main.05eae418.chunk.js.map
            ├── runtime~main.fdfcfda2.js
            └── runtime~main.fdfcfda2.js.map
    

    其中这些我暂时还不知道是做什么的,但是我的React的src文件夹中其实只有一个index.js,就会build出这么多东西来,而且这个index.html是打不开的,暂时存疑。

    后面我们需要使用到build文件

Django的处理

对Django的处理主要是你要搞清楚创建一个项目需要的步骤,这个可以看作对之前的东西的总结吧

< 操作步骤 >
  1. 创建项目:

    source activate Blog				#进入虚拟环境
    django-admin startproject service	#建立项目
    cd service
    python3 manage.py startapp blogpost	#建立应用
    python manage.py makemigrations	
    python manage.py migrate
    python manage.py runserver			#启动服务器
    #访问8000端口
    
  2. 增加目录:因为创建完项目之后有些需要的目录是没有的所以需要手动创建

    • 在应用目录server下创建template和static分别用于储存模板文件和静态文件,将build/static中的所有文件放入static中,将build中的index.html放入templates/server/下。可是这里有几个很奇怪的点

      • 在放置templates的文件的时候,我们需要建立一个server文件夹,然后将index.html放进去,这是我门在Blog1中所说的,如果不这样做的话会报错
      • 可是在放置static的时候,不能在里面建立server文件夹用来存放js和css,必须直接存放,否则接受不到
  3. 配置:对项目文件夹进行配置,修改service/setting.py

    • 在INSTALLED_APP中添加项目名‘server’
    • 在TEMPLATES中添加templates的路径:‘DIRS’: [os.path.join(BASE_DIR ,‘templates’)]
    • 按照之前的教程配置数据库
    • 必须要注意的是,在你修改[ ]的时候,记得加 “,” !!!
  4. url的配置:

    • 修改service/setting.py:因为本来就会有一个admin,这是用来管理的。所以需要你添加你自己应用的url,加入:
    path('server/', include('server.urls')),
    

    用于索引到刚刚创建的urls.py

    • 修改server/urls.py:这个本来就什么也没有,所以全都自己写
    from django.urls import path
    from . import  views
    
    urlpatterns = [
        path('',views.AjaxLoad2),
        path('AjaxLoad/',views.AjaxLoad)
    ]
    
    • !!!需要注意的是:一定注意到这个/,你自己添加的一定要有这个/,否则会404

    • 这里的AjaxLoad是需要对应上面的index.js中的发送的路径:

        xmlhttp.open("POST","http://127.0.0.1:8000/server/AjaxLoad/",true);
      
  5. 添加views.py

    from django.shortcuts import render
    import json
    from django.http import HttpResponse
    
    # Create your views here.
    
    
    def AjaxLoad2(request):
        if request.method == "GET":
            return render(request, "server/index.html")
    
    def AjaxLoad(request):
        if request.method == "POST":
            if request.body == "":
                return HttpResponse("请您填写有效信息!")
            else:
                receive_bytes = request.body
                receive_str = bytes.decode(receive_bytes)
                receive_obj = json.loads(receive_str)
                print("~~~~~~>", type(receive_obj),receive_obj)
                name = receive_obj["name"]
                sex = receive_obj["sex"]
                age = receive_obj["age"]
                print("#####name",name)
                return HttpResponse("你好!"+name+","+age+"岁的"+sex+"宝宝!")
    
  6. 访问http://localhost:8000/server/即可

跨域访问

这样子是可以显示出来了

image-20190214170027168

可是问题是不能提交,就是不能进行React与Django的交互,利用Chrome的检查报错如下:

index.js:45 OPTIONS http://127.0.0.1:8000/server/AjaxLoad/ 404 (Not Found)
(index):1 Access to XMLHttpRequest at 'http://127.0.0.1:8000/server/AjaxLoad/' from origin 'http://localhost:8000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

此处参考博客:https://www.jianshu.com/p/8f43ad5482f4 解决了跨域访问问题

  • 当 Web 资源请求由其它域名或端口提供的资源时,会发起跨域 HTTP 请求(cross-origin HTTP request)。
    比如,站点 http://domain-a.com 的某 HTML 页面通过 的 src 请求 http://domain-b.com/image.jpg。网络上,很多页面从其他站点加载各类资源(包括 CSS、图片、JavaScript 脚本)。
    出于安全考虑,浏览器会限制脚本中发起的跨域请求。比如,使用 XMLHttpRequest 和 Fetch 发起的 HTTP 请求必须遵循同源策略。因此,Web 应用通过 XMLHttpRequest 对象或 Fetch 仅能向同域资源发起 HTTP 请求。

这样子一个React + Ajax + Django的例子就完成了

== 2019.2.15 ==

Ngnix

参见博客:https://www.cnblogs.com/wcwnina/p/8728391.html

React + Django + Pycharm

参照博客 https://www.jianshu.com/p/aeb02c8e56d5 ,写了一个自动化的脚本用于联合编写React和Django的程序

BASE_DIR=$HOME/Desktop/MyBlog
  
react_kit_dir=$BASE_DIR/React/src		#存放react源码用于编译的目录
django_pro_dir=$BASE_DIR/service/server	#django的工作目录
pro_name=server							

dist_dir=$BASE_DIR/React/build			#build完之后的react编译结果目录

cp -rf $django_pro_dir/React/* $react_kit_dir/	#首先拷贝编写的源码到React源码中等待编译

cd $react_kit_dir/
npm run build

cp -f $dist_dir/*html  $django_pro_dir/templates/$pro_name	#将编译完成的html放到templates中
cp -rf $dist_dir/static/*  $django_pro_dir/static/$pro_name	#将静态文件放入static中

### 搭建个人博客网站的技术栈 搭建个人博客网站是一个多阶段的过程,涵盖了从规划到部署的多个方面。以下是具体的方法和技术栈的选择: #### 1. **规划网站内容和结构** 在开始编码之前,明确博客的目的及其核心功能至关重要。这一步决定了后续技术选型的方向[^3]。 - 明确目标:是用于分享技术文章、生活感悟还是其他主题? - 设计页面:常见的页面包括首页、分类页、标签页、单篇博文详情页、关于作者页等。 - 页面布局:可以通过草图或者设计工具(如 Figma)完成初步的设计方案。 #### 2. **选择合适的技术栈** ##### 前端部分 前端负责用户的界面显示和交互逻辑。可以选择以下技术组合: - **HTML/CSS/JavaScript**: 构成网页的基础三件套。 - **现代框架**: 可以考虑使用 React 或 Vue 这样的现代化框架来增强用户体验[^3]。 ##### 后端部分 后端提供数据存储和服务支持。根据需求复杂度和个人熟悉程度,可选择不同的解决方案: - **Python 的 Flask/Django**: - Flask 更适合轻量级的应用场景,易于快速上手并实现基础功能[^2]。 - Django 是一个全栈框架,内置了许多高级特性(ORM、Admin 界面),非常适合需要强大后台管理系统的情况[^4]。 - 数据库建议采用关系型数据库 MySQL 或 PostgreSQL,它们能够很好地满足大多数博客的数据管理需求[^3]。 #### 3. **开发过程中的关键点** - **设置开发环境**: 需要安装必要的依赖项,例如 Python 解释器、虚拟环境工具 `venv` 或者包管理工具 pip[^4]。 - **编写代码**: - 对于 Flask 应用程序,可以从创建基本路由入手,定义 URL 路径与视图函数之间的映射关系[^2]。 ```python from flask import Flask, render_template app = Flask(__name__) @app.route('/') def home(): return render_template('index.html') if __name__ == '__main__': app.run(debug=True) ``` - 在 Django 中,则需配置项目的 settings 文件,并利用其强大的 ORM 功能操作模型对象。 - 测试: 开发过程中应持续验证各个模块的功能是否按预期工作,在不同设备和浏览器环境下进行全面兼容性检测[^3]。 #### 4. **部署上线** 当本地调试完成后即可进入最后一步——将站点发布至公网访问地址下: - 推荐使用的云服务平台有 GitHub Pages(仅限静态资源)、Netlify/Vercel(支持 SSR/JAMstack架构),还有 Heroku(AWS EC2实例托管). - 若选择了基于 Python 的 Web Frameworks(Django / Flask),则还需要额外关注 WSGI Server(Gunicorn/uWSGI)以及 Nginx/Apache反向代理层的相关配置细节[^4]. --- ### 总结 通过上述步骤可以看出,成功建立一个完整的个人博客不仅考验开发者对各项技能的理解运用能力,同时也非常注重实践动手能力和解决问题的经验积累。希望这些指南能帮助您顺利开启自己的线上创作之旅
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值