巨蟒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,

相關文章
相關標籤/搜索