巨蟒python全栈开发-第11阶段 ansible_project3

今日大纲:css

1.用户建立html

2.前端优化前端

3.用户编辑python

4.用户删除linux

5.ansible api介绍web

 

1.用户建立

新建一个user_create.html的页面sql

<form class="form-horizontal" id="createForm" action="" method="post">{% csrf_token %}
  <div class="box-body">
  {% for field in form %}
    <div class="form-group{% if field.errors %} has-error{% endif %}">
        <label class="col-sm-2 control-label">{{ field.label }}
          {% if field.field.required %}
            <span class="text-red">*</span>
          {% endif %}
        </label>
        <div class="col-sm-9">
            {{ field }}
        </div>
        <span class="help-block">
          {% for error in field.errors %}
              {{ error }}
          {% endfor %}
          {{ field.help_text }}
        </span>
    </div>
    {% endfor %}
    <div class="box-footer text-center">
        <button type="reset" class="btn btn-warning">清空</button>
        <button id="createBtn" type="button" class="btn btn-info">提交</button>
        <p class="text-center"><i id='iconWait'></i></p>
    </div>
  </div>
</form>
{% block js %}
<script>
    $("#createBtn").on("click",function () {
        if ("{{ pk }}" == "0") {
            url="{% url 'createuser' %}"
        } else {
            url="{% url 'edituser' pk %}"
        }
        Net.post({
            url:url,
            data:$("#createForm").serialize(),
            go:{% url 'userlist' %}
        })
    })
</script>
{% endblock %}
View Code

里边有一个"清空"按钮和"提交按钮",下边的id="iconWait"表明转圈的那个.shell

添加一个add-btn属性在userlist.html里边django

 

 下面,咱们再建立一个py文件user_form.pybootstrap

 

点表明当前文件夹下,两个点表明上层文件夹

 

 

下面,咱们须要在web文件夹下面新建一个user.py文件

咱们先导入上边的文件以及文件的类.

须要继续导入views.py中的render

下面,再写一个url在urls.py里边.

 

运行:

 

 

修改获得上边的内容.运行,依然是下图的样式的内容.

 

 

如今出现一个问题,点击"添加用户",弹不出来窗口.

 

将user_edit放到图示的位置.

将utils放到如图表示的位置.

 

 

 

下面是变化的一些文件内容.

 

 urls.py

"""issue URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin
from web.views import *     #*表明web中的views全部的
from web.user import *     #*表明web中的user全部的
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^home/', home,name='home'),
    url(r'^home2/', home2,name='home2'),
    url(r'^createuser/', create_user,name='createuser'),
    url(r'^edituser/(\d+)', create_user, name='edituser'),
    url(r'^login/', login, name='login'),
    url(r'^logout/', logout_view, name='logout'),
    url(r'^userlist/', userlist, name='userlist'),
]
View Code

home.html

{% extends 'master/base.html' %}
{% block body %}
<h1>da</h1>
<div class="btn btn-sm btn-success create_btn" >建立</div>
{% endblock %}
{% block js %}
    <script>
    {#$("#user").addClass("active")#}
    {#$("#init").addClass("active")#}
    $("#menu_issue").addClass("active")
    $("#update").addClass("active")
    {#点击这个按钮执行下面的函数#}
    $(".create_btn").on("click",function () {
        ui.box({
            remote:{% url 'home2' %}
        })
    })
    </script>
{% endblock %}
View Code

home2.html

{#<h1>da</h1>#}
<form action="">

</form>
<div class="btn btn-sm btn-success create-btn" >建立home2</div>
{#{% endblock %}#}
<div><i class="wait"></i></div>
{% block js %}
    <script>
    $("#user").addClass("active")
    $(".create-btn").on("click",function () {
       Net.post(//发送请求到后端
           {
               "url":{% url 'home2' %},
               "data":{"name":"alex","age":9000},
               "go":{% url 'home' %},
           }
       )
    })
    </script>
{% endblock %}
View Code

login.html

{% load static %}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>登陆 - 代码发布系统</title>
  <!-- Tell the browser to be responsive to screen width -->
  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
  <!-- Bootstrap 3.3.7 -->
  <link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.min.css' %}">
  <!-- Font Awesome -->
  <link rel="stylesheet" href="{% static 'plugins/font-awesome/css/font-awesome.min.css' %}">
  <!-- Ionicons -->
  <link rel="stylesheet" href="{% static 'plugins/Ionicons/css/ionicons.min.css' %}">
  <!-- Theme style -->
  <link rel="stylesheet" href="{% static 'AdminLTE/css/AdminLTE.min.css' %}">

</head>
<body class="hold-transition login-page" style="background-image: url({% static 'img/login_bg2.jpg' %});     background-repeat: no-repeat; background-size: 100%; ">
<div class="login-box">
  <div class="login-logo">
    <a href=""><b style="color: #fff;">代码发布系统</b></a>
  </div>
  <!-- /.login-logo -->
  <div class="login-box-body">
    <p class="login-box-msg">Sign in to start your session</p>
    <div class="text-red" style="text-align: center;">
    </div>

    <form action="" method="post">{% csrf_token %}
      <div class="form-group has-feedback">
        <input name="domain" type="hidden" class="form-control" placeholder="Domain" value="default">
        <input name="email" type="text" class="form-control" placeholder="Username">
        <span class="glyphicon glyphicon-envelope form-control-feedback"></span>
      </div>
      <div class="form-group has-feedback">
        <input name="password" type="password" class="form-control" placeholder="Password">
        <span class="glyphicon glyphicon-lock form-control-feedback"></span>
      </div>
      <p style="color: red;text-align: center">{{ error_msg }}</p>
      <div class="form-group has-feedback">
          <button type="submit" class="btn btn-primary btn-block btn-flat">Sign In</button>
      </div>
    </form>

  </div>
  <!-- /.login-box-body -->
</div>
<!-- /.login-box -->

</body>
</html>
View Code

user_create.html

<form class="form-horizontal" id="createForm" action="" method="post">{% csrf_token %}
  <div class="box-body">
  {% for field in form %}
    <div class="form-group{% if field.errors %} has-error{% endif %}">
        <label class="col-sm-2 control-label">{{ field.label }}
          {% if field.field.required %}
            <span class="text-red">*</span>
          {% endif %}
        </label>
        <div class="col-sm-9">
            {{ field }}
        </div>
        <span class="help-block">
          {% for error in field.errors %}
              {{ error }}
          {% endfor %}
          {{ field.help_text }}
        </span>
    </div>
    {% endfor %}
    <div class="box-footer text-center">
        <button type="reset" class="btn btn-warning">清空</button>
        <button id="createBtn" type="button" class="btn btn-info">提交</button>
        <p class="text-center"><i id='iconWait'></i></p>
    </div>
  </div>
</form>
{% block js %}
<script>
    {#$("#createBtn").on("click",function () {#}
    {#    if ("{{ pk }}" == "0") {#}
    {#        url="{% url 'createuser ' %}"#}
    {#    } else {#}
    {#        url="{% url 'edituser' pk %}"#}
    {#    }#}
        Net.post({
            url:url,
            data:$("#createForm").serialize(),
            go:{% url 'userlist' %}
        })
   // })
</script>
{% endblock %}
View Code

user_edit.html

<form class="form-horizontal" id="createForm" action="" method="post">{% csrf_token %}
  <div class="box-body">
  {% for field in form %}
    <div class="form-group{% if field.errors %} has-error{% endif %}">
        <label class="col-sm-2 control-label">{{ field.label }}
          {% if field.field.required %}
            <span class="text-red">*</span>
          {% endif %}
        </label>
        <div class="col-sm-9">
            {{ field }}
        </div>
        <span class="help-block">
          {% for error in field.errors %}
              {{ error }}
          {% endfor %}
          {{ field.help_text }}
        </span>
    </div>
    {% endfor %}
    <div class="box-footer text-center">
        <button type="reset" class="btn btn-warning">清空</button>
        <button id="createBtn" type="button" class="btn btn-info">提交</button>
        <p class="text-center"><i id='iconWait'></i></p>
    </div>
  </div>
</form>
{% block js %}
<script>
    $("#createBtn").on("click",function () {
        Net.post({
            url:{% url 'edituser' pk %},
            data:$("#createForm").serialize(),
            go:{% url 'userlist' %}
        })
    })
</script>
{% endblock %}
View Code

userlist.html

{% extends 'master/base.html' %}
{% block body %}
    <div class="row">
        <div class="col-xs-12">
            <div class="box">
                <div class="box-header">
                    {#              <h3 class="box-title">Responsive Hover Table</h3>#}
                    {#                <button class="btn-sm btn-success create-btn">添加用户</button>#}
                    <div class="btn btn-sm btn-success add-btn">添加用户</div>
                    <div class="box-tools pull-right">
                        <form action="" method="get">
                            <div class="input-group input-group-sm" style="width: 150px;">
                                <input type="text" name="table_search" class="form-control pull-right"
                                       placeholder="Search">

                                <div class="input-group-btn">
                                    <button type="submit" class="btn btn-default"><i class="fa fa-search"></i></button>
                                </div>
                            </div>
                        </form>
                    </div>

                </div>
                <!-- /.box-header -->
                <div class="box-body table-responsive no-padding">
                    <table class="table table-hover">
                        <tr>
                            <th>序号</th>
                            <th>用户名</th>
                            <th>用户邮箱</th>
                            <th>角色</th>
                            <th>部门</th>
                            <th>是否可用</th>
                            <th>建立时间</th>
                            <th>操做</th>
                        </tr>

                        {% for user in users %}
                            <tr>
                                <td>{{ forloop.counter }}</td>
                                <td>{{ user.name }}</td>
                                <td>{{ user.email }}</td>
                                <td>{{ user.get_role_display }}</td>
                                <td>{{ user.department|default:"" }}</td>
                                <td>{{ user.get_is_unable_display }}</td>
                                <td>{{ user.create_time|date:"Y-m-d H:i:s" }}</td>
                                <td>
                                    <div class="btn btn-success btn-sm edit-btn"
                                         data-url="{% url 'edituser' user.pk %}">编辑
                                    </div>
                                    <div class="btn btn-warning btn-sm del-btn" data-url="{% url 'deluser' user.pk %}">
                                        删除
                                    </div>
                                </td>
                            </tr>
                        {% endfor %}

                    </table>
                </div>
                <!-- /.box-body -->
            </div>
            <div>
                <ul class="pagination pagination-sm no-margin pull-right">
                    {{ page_html|safe }}
                </ul>
                <!-- /.box -->
            </div>
        </div>
    </div>
{% endblock %}

{% block js %}
    <script>
        {#$(".add-btn").on("click", function () {#}
        {#    ui.box({#}
        {#        title: "新增用户",    //上边显示的标题#}
        {#        remote:{% url "createuser" %}#}
        {#    })#}

                $("#user").addClass("active");
        $(".add-btn").on("click", function () {
            ui.box({
                title: "新增用户",
                remote: {% url 'createuser' %}
            })
        })
        $(".edit-btn").on("click", function () {
            ui.box({
                title: "编辑用户",
                remote: $(this).attr("data-url")
            })
        })
        $(".del-btn").on("click", function () {
            var url=$(this).attr("data-url");
            ui.confirm("你确认要删除这条记录吗?",function () {
                Net.get({
                    url:url,
                    reload:true,
                })
            })
        })
    </script>
{% endblock %}
View Code

 上班通过很长的调试才调整好,如今在服务器上访问

127.0.0.1:8000/home和

127.0.0.1:8000/userlist

缘由是上边的views.py

 运行:

点击"添加用户",获得下边的窗体内容.

咱们打开上边的index.html文件.

获得上面的form的内容.下面是查看源码.

 

 思考如何所有都加上form-control?

 

 

上边是循环加上form-control属性.

全部的input全部类属性form-control.

咱们须要继承这个新的NewModelform.

这个时候,再次点击"添加用户",出现下面的界面:

 注意这个地方设置一下size.

 

 上边写size的目的是调整大小,能够直接写在源码中.

 下面修改以后的内容.

 

修改源码在这里修改不过来,所以仍是写在原来的位置,具体缘由未知???

这个时候,咱们再点击"提交",出不来结果.怎么处理?

首先在页面中添加一个点击事件.

再次刷新页面,

下面咱们直接获取,经过serialize方法

 

在后端打印下获取到的POST.

运行,点击上边的"建立用户",点击提交,服务端获得下面的结果.

 

 

获得上边的内容,须要都写上serialize().

serialize() 方法经过序列化表单值,建立 URL 编码文本字符串。

点击提交,

服务端依然得不到数据.

由于上边是id=

因此,下面须要加上#

 

点击提交,获得上边csrf中间件.

上边中包括不少值.下边的后端也拿到了不少的值.

这个时候,咱们添加成功以后,跳转到userlist页面.

上边须要导入的三个包

下面,咱们再写一个在后端真正提交的一个操做,如何写呢?

 

这个时候,再次测试可能会出现上边的错误内容,须要加上userlist函数,进行处理.

 

咱们获得上边的内容,须要添加上路由userlist.

可能出现上边的错误.上边显示"这个字段不能为空"

最后这个地方,咱们须要return返回这个email的.

 

 

点击"提交",

 

而后返回,首页.

 

 

下面,咱们须要添加一个pull-right类属性

 

 

 

 

经过上边循环出内容

 forloop.counter 老是一个表示当前循环的执行次数的整数计数器。 这个计数器是从1开始的,

因此在第一次循环时 forloop.counter 将会被设置为1。

获得上边的内容.

能够看一下models选择内容.

下面须要分析上边的循环出来的写法?

 

 

 

 

修改一下userlist.html文件,如上图所示

上边的错误,是咱们须要加上userlist路径,以下图所示

 

 

 

2.前端优化.

 

上图是修改以后的userlist函数.

 

 

打开上边的文件,查看加的位置.

 

 

页码位置

上图是传递过来的内容.

这个时候,右下角就有页码了.

看一下能不能用搜索,搜alex,能够搜索到下面的内容.

增长和查找已经写完了,下面开始写编辑和删除了.

 

 

 

添加上边的active.

 

上边就是修改模板,

 

将上边的这个传递的参数.

 

这个时候,咱们就将上边的内容成功修改为了"用户列表"这个内容.也就是说咱们经过后端传递到了前端的位置.

 

思考用户名如何传递到前端?

上边是咱们导入的模块.

session能够传递user用户名,咱们还有什么办法传递?除了密码不能传递.

咱们登陆的时候已经拿到了用户名字.上图的第28行,如何传递到前端?

 

 先写一个login和logout函数和路由再说.

 

 

 

 上边咱们跳转到的是userlist界面

 前端怎么写?

 

 

登陆以后没有出现用户名???

想要传递参数,必须放在session里边才能传递.

上边的31行不能够,咱们用下图所示的试一下,看一下能不能所有传递过去?

 

 

 

 获得上图这样,不是一个序列化的对象.查询出来的是queryset,如何变成可序列化的对象?

又出现上边的问题.

下面,来一个新的方法,导入下面的这个模块

 

再次运行.

 

 咱们看到上边的内容成功登录.名字出来了,

还有一种方法是重写中间件,中间件有5个方法,重写的是哪一个?

在这里,咱们就先将上边这条语句注释掉.

再在auth.py里边写一个类.

 

 

 

上边是重写的类.以及其中的方法,上边是用法.其中打印一下response

下面,咱们须要在settings.py中加上一个内容

 

用上边的方法,咱们就不能用render了.下图中的第13行从render,替换成TemplateResponse.

 

 

刷新上边的这个界面.服务端获得这个数据,也就是咱们打印出服务端的auth中的response

 

 

TemplateResponse在什么地方用?在模板渲染的时候才能用.

重写这个方法,再次打印另外一个内容.

 

再次刷新一下,

咱们获得下面的值.

咱们须要更新一下这个内容.

 

咱们将上边的内容,都修改为user.

 为了避免重复,咱们仍是须要从新修改会account

 

 

修改后,咱们获得上边的内容.注意上边要加逗号,只有登陆以后才会有account.

左上角咱们须要修改用户名.

 

 

在上图中修改为user.name

 

 

这样就成功修改完成了.

一种是写在session中,另外一种是重写中间件.

 

3.用户编辑

下面,再说一下编辑

 

上边咱们加上了data-url

 

修改用户如何写?

下面先单独写一个编辑用户的内容.

user_edit.html就是由user_create.html修改过来的

 

修改的位置,

上边是咱们传递过来的pk值.

 

 

 

 

可能出现没有edituser这个路径.

edituser这里须要传递一个pk值

 前端多个空格可能就会出错.

 

 

 

 

 

这个时候,点击编辑,能够弹出,对应的窗体.

attrs能够拿到值.也能够加上必定的属性.好比加上disabled属性.

后边什么都不加能够拿到这个值.

 

$this表示的是当前点击的对象.

 

 

 

 下面,咱们合并一下这个建立和编辑.

 

 js里边不能作数据判断,一切数值计算都须要转换成字符串

服务端出现一个错误,

由于此时要有一个视图函数须要都修改为create_user.

 

 

 注意,uswer.pk是必定获取不到的

上图中加上引号,url

一直报错出不来前端的弹窗里边的内容,缘由是多写了一个空格.

 

 

出现上图的没有定义,问题是什么?同名函数,共用一个函数和共用一个界面html

编辑,不改上边的代码,出现上边的问题"邮箱已存在",应该如何操做?

 

 

缘由是什么?form没有写对.

下面修改form

 

 

此时,咱们再次提交错误重复的信息,会出现上边的内容.

 

上图显示,咱们点击"编辑",不修改,"提交",报上边的错误

 

上图是原来的样子,下面是修改以后的样子.

 

 

 

添加相同的邮箱可能存在错误.如何解决呢?

 

 上图中,邮箱已存在,咱们须要进一步操做.上边这个已经成功解决了问题.

最开始,咱们是按照上图的写法,写的.

 若是一开始查找的一条数据,下图的邮箱,而且修改的数据和库里边查找的数据是同样的,表明这条数据邮箱没有改变.因此return回去.

咱们先去表里查找这个邮箱.若是查不到,证实是一个没有的数据.

 

若是查找到一个值和目前的传递进来的数据是不一致的.须要告诉,可能这里边是有的.

else将全部的阶段了,因此下面的三行数据都是不须要的了.具体见下图.

user.count()==1表明查找到的是本身的那条记录.而且传递过来的值是不同的

 对instance的理解,

 

 

 

 

 

咱们获得上边的instance不是None,所以self.instance=instance.

#17行,查到了1条记录,而且邮箱没有改变,

 

 下面是删除的内容.

 

4.用户删除

 

上图是删除,界面的写法,看一下源码中的写法:

 

 

刷新浏览器界面,点击"删除"

 

上边是后端传递的信息

 

上图是url中的删除路由.

 

 

当咱们点击"确认"的时候,this就至关于上边的弹窗.

 

所以这种写法是错误的,咱们须要按照下图的写法,将含有this的这行代码写在下图的位置.

 

这个时候,就能够成功删除了,删除的同时须要刷新一下也就是reload:true

 

注意,不能将登录的用户删除,不然会跳转到登陆界面.

5.ansible api介绍,一些环境的搭建

 下面,咱们须要在linux环境中安装开发环境.

yum install -y python36-pip python36-devel
#安装成功

yum install -y openssl-devel
#安装成功

#下面这个安装失败,缘由是须要安装成功ansible才能安装下面的成功
pip3 install ansible

(1)安装python3

#第一步,走到opt目录下
cd /opt
#第二步.解决python编译安装所需的软件依赖
yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y
#第三步:下载python3源码包
wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz
ls            #看下是否有压缩包
xz -d Python-3.6.7.tar.xz
tar -xf Python-3.6.7.tar        #解压缩,生成一个python源码文件夹
ls
#第四步:进入python源码文件夹
cd Python-3.6.7 
ls     #查看一下文件夹内的内容
#第五步:进行编译安装,编译三部曲,源码编译的过程,下一步就是这些东西
(1)第一曲
./configure --prefix=/opt/python36/        #当前文件夹下的configure
#--prefix  参数解释:指定python36安装的位置,绿色表明可执行
#上边这条命令必须进入文件夹 Python-3.6.7 执行
#这样就会自动释放一些编译文件
#只要不出现error(错误信息)就能够了,出现warning(报警信息)不重要
#这个时候就会多了一些makefile文件
ls
(2)第二曲
make

(3)第三曲,此时就开始安装python3软件
make install
#上边两部能够合成一步
#make && make install   #表明执行完make就执行后边的make install命令    
#上边安装速度可能会慢一些

#第六步.进入python36
#安装目录,检查bin目录
python      #按Tab键,python3没有出来,缘由是环境变量没有配置
cd  /opt/
ls          #咱们看到最终安装完成的包python36

cd python36/
ls          #咱们对bin目录有兴趣,须要进入

cd bin
ls

#第七步,配置python3的环境变量 PATH
#1.取出当前的path变量(环境变量)
echo $PATH     #取出当前的环境变量
#/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
pwd   #查看当前目录

#2.填写python3的bin目录到PATH中
PATH="/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
#3.讲环境变量,写入到全局配置文件/etc/profile 
vim  /etc/profile 
i    #插入
o    #走到下一行

4.写入以下代码,在最底行写入以下配置
PATH="/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
5.读取配置文件,加载变量生效
source  /etc/profile  
python      #按Tab键,查看python内容
python3     #进入python3交互界面

(2)安装django,运行django

yum install tree

 

 

#1.安装django模块
pip3 install -i  https://pypi.douban.com/simple django==1.11.18
#ctrl+C中断安装

#2.升级pip    
pip3 install --upgrade pip

pip3 list    #看一下pip3安装了什么
#3.经过命令建立django项目
#django-admin startproject crm
#django-admin startapp app01
cd  /opt/
ls

django-admin startproject crm
ls

cd crm
ls
 
python3 manage.py runserver    #直接这样写是有问题的
#中断

python3 manage.py runserver 0.0.0.0:8000    #依然存在问题
#访问192.168.34.133:8000这个网址,能够访问,可是这里访问不成功,缘由是防火墙

iptables -L      #查看防火墙的一些规则
4.关闭防火墙
iptables -F  
再次运行下面的命令:
python3 manage.py runserver 0.0.0.0:8000#依然存在问题可能
python3 manage.py runserver 192.168.34.133:9999 #不行再试一下这个命令
#访问地址   192.168.34.133:9999

#浏览器中报下面的错误信息
#Invalid HTTP_HOST header: '192.168.34.133:9999'. You may need to 
#add '192.168.34.133' to ALLOWED_HOSTS.
#下面,咱们须要中断代码
ls
tree
cd ..    #回到上一级目录回到  /opt目录下面
ls
tree crm   #看一下crm的目录结构

cd crm/
vim crm/settings.py
/ALLOW   #快速找到,修改内容
ALLOWED_HOSTS = ["*"]
python3 manage.py runserver 192.168.34.133:9999  #在crm目录下面,再次启动
#访问192.168.34.133:9999能够成功访问了.
192.168.34.133:9999
192.168.34.133:9999/admin    #能够正常使用了.

 需求,加上hello 视图"来了老弟!"

 

vi crm/urls.py

yyp    #命令是复制一行,退出,建立app01

#建立一个app01
django-admin startapp app01
ls
tree     #当前在crm目录下面
vi crm/urls.py   #再次打开这个文件

from django.conf.urls import url
from django.contrib import admin
from app01 import views           #修改的位置1

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^hello/', views.hello),  #修改的位置2
]

 

ls       #在crm下面

vi app01/views.py
用空格键解决,
from django.shortcuts import render,HttpResponse  #添加后边的HttpResponse
def hello(request):                         #添加函数
    return HttpResponse("来了老弟")
 Create your views here.

 

vi crm/settings.py 
 
 #在settings.py中导入app01
 
 INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',               #修改的位置
]

#linux端口范围0-65536.5000-10000
ls
python3 manage.py runserver 192.168.34.133:8000

#访问下面的地址
http://192.168.34.133:8000/
#报错,也就是首页没有东西.大黄页,咱们在公网上不能让别人知道咱们的视图,须要隐藏视图

#思路:将setting.py里边的debug由true修改为false

vi crm/settings.py

DEBUG = False     #目的,不能将视图函数暴露给别人

#再次运行下面的命令
python3 manage.py runserver 192.168.34.133:8000

#访问浏览器地址
192.168.34.133:8000   #这个时候就不会暴露了

http://192.168.34.133:8000/hello/        #这个时候能够看到内容了

 

安装成功django以后,咱们再次安装一遍ansible
pip3 install ansible
#安装成功

这样,咱们就将ansible模块和python3以及django安装成功了.

 

 

 

 上图是centos7的写法,下图是centos6的写法

 

网关被.1是window机器占用,所以咱们须要用,2

 也能够在下图的网关设置中加上DNS.这样就能够加上一个静态IP地址了.

 

 最后,咱们仍是只须要关注下面的三个信息.

 

 下图是我本身的IP修改内容

 

 

下面看一下ansible的源码,

上边是AdHoc函数.

ansible -m 模块名 -a  参数

对应的是playbook函数

咱们先执行一个命令

上边组织了一个"主机数据"

 

 

 

 

上边咱们能够看到"ok","failed","unreachable","skipped",四个顶级的字典,ok,失败,不可达,跳过.

ok中,第一个ip地址,stdout表示输出,/root,pwd表示执行的命令

启动上边的两台机器,上图,在第1和第2条命令中间执行

第一条表示修改数据,获得下面的结果

 

 

若是修改为上图中,一个没有的命令"pd",

 这个时候,就直接出来在failed里边了.

 

上图第二行的倒数部分显示,命令没有找到.

 

 

咱们再写一台找不到主机的.

再次运行,看一下区别是什么?

一种是命令错误,另外一种是端口不可达是找不到主机.

 

 

hostnane的做用是什么?

下面咱们改为104

 

 

 

 

hostname表明的是key值.

上图是咱们传递值到这个函数里边.

103行,判断是否是一个list,断言.

 loader_class()

咱们看到下图导入的这个包,ansible自带的一个方法,数据加载

这个时候又运行了下面的方法,

看一下这个变量管理类

 而后,就初始化了下图的函数.

 

而后执行,下面的方法

循环主机数据,在列表中.

 

下面,就等于上图中的Host,点击77行的Host,咱们获得下面的内容,

传递过来host_data,host_data循环这个列表中的每个值.

 

端口默认是22,若是是22能够默认不写,具体见下图,

 

 

添加密码和秘钥文件.

若是没有vars,默认是一个空的字典,items(),而后组合了一下

playbook有一个变量的说法,

 ansible自动2.0以后adhoc也会转换到playbook里边执行.

下图,是hostname出来的值104

 

 没有组的话,咱们须要在组的基础上添加信息.

 

 

注意ansible中有一个"组"的概念.

以前都是在init_host文件里边改的,如今咱们只须要将IP地址组成一个虚拟的组.

 而后将虚拟的组,给了CommandRunner,这个类继承自AdHocRunner这个类

 

 

 再次看一下,AdHocRunner定义的内容,

 

 

上图就是咱们自定义的回调函数.

 

 

21行表示的是命名元组,一系列参数的指定.forks表示的是并发

 ansible -h    #查看帮助信息,默认是5个,这里设置的是10个.

 

咱们将拿到的值进行处理.执行init方法

也就是说,执行上图的C都满满的Runner,也就是执行init方法.也就是下图函数的init方法

 

先执行init,再执行CommandRunner,而后,咱们再执行下图的函数

函数传递了三个参数,下面开始作判断,若是module有,而且再也不选择的范围内,报错.若是不传,默认是module="shell"

也就是从test_runner.py传递过来的内容.

 

 

 

也就是说,上图的hosts,等于实例化的inventory,

 

动态生成上图的invent,而后获得全部的inventory

 

上图的hosts和name等于的值.而后再运行上图中的run,也就是父类的内容

 

 

也就是下面,咱们传递进来的值,

 

 

上图是获取系统的变量,

 第一个if语句,若是不是pattern,咱们返回一个空的  {}

 

再看一下下图的信息

 

 

 

 

上图的callback信息.

 

 

看一下上图的tasks,tasks作的是下图的信息.

 

 

 

获得上图的信息.

咱们将值通通加载到clean_tasks列表中,而后返回回去

 下图是组装的一个字典

 

 

 

上边传递的值进行对应

 

 

获得上图的play,

 

 

上图是定义的回调函数以及password,上边是组成的组tqm

 

运行上图的位置

 

 异常中什么都没有写,

 

 

 

 

 这就是ansible走AdHoc走的一系列命令.

知道怎么用就好了,这只是官网上的一部分,修改了一点点

AdHoc和下面的command差很少

 

 

最后也是组成了上边的内容.

 

 一样,运行了下面的run方法.

 

 

 

 

 

 

 

上边打开的文件,以及内容

 

 

 上边的stdout对应的值是root,,命令是whoami

 获得上边的内容.

 

 

上图是playbook组成一个列表,一样动态生成一个crm,playbookrunner

 

 

 而后运行,下面的run方法,传递的是playbook_path参数,将path变成列表将值放在括号里边

 

 而后,咱们运行了下面的run().

 

 

 

获得上边的内容.也就是下面的vi a.yml

 写的是下面的内容.

 

 

执行下面的yml文件.

 

 

 

运行一下报错,

再次打开,修改

 

 

 获得下面的内容.

 

上边显示的错误是极其链接不上.上边是机器的状态是OK的,运行playbook,下面的一行显示的信息.

下面,咱们拿到这个信息就能够进行判断了.

下面,咱们再次写一个正常的主机和ip进行处理.

这个时候,咱们再次运行.

上班的Gathering Facts,  playbook的第一步是收集用户的信息,下图白色部分是一个大的列表.

tasks第一个是手机信息,createuser

 咱们看到了下图这个主机被建立了.

 

一样,咱们能够传递变量,修改上边的这个playbook文件

 

 

 传递下面的数据.

 

这个时候,咱们再次执行

 获得下图的name101

 再看一下101IP中是否成功完成了建立帐户alex101了.

 

 

注意,这个playbook的hosts须要协程all,须要哪一个用就能够了,若是写成单个的机器须要正则匹配很麻烦,这里很少说.

用哪台机器,传递哪台机器就能够了.

6,特殊好用的工具在windows和linux上

 

 

 

 

 

 

获得上边的内容.

点击"Yes"

 

 

 

点击上图位置

 

咱们获得了后端linux的目录,能够查看

 

 

 点击右下角的OK

 

OK,

相关文章
相关标签/搜索