1、Python3_cmdb项目初始化

1、Python3项目初始化
[root@VM-4-12-centos ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@VM-4-12-centos ~]# hostname txy 临时修改主机名,主机重启不生效
[root@VM-4-12-centos ~]# /bin/bash
[root@txy ~]# yum install tree wget -y
[root@txy ~]# pip3 install virtualenv
[root@txy tmp]# wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
[root@txy tmp]# yum install -y gcc gcc-c++ zlib*
[root@txy tmp]# tar zxvf Python-3.6.8.tgz
[root@txy tmp]# cd Python-3.6.8/
[root@txy Python-3.6.8]# ./configure --enable-shared --prefix=/usr/local/python3
[root@txy Python-3.6.8]# make &&make install
[root@txy Python-3.6.8]# /usr/local/python3/bin/python3 -V
[root@txy Python-3.6.8]# virtualenv -p /usr/local/python3/bin/python3.6 /app/py36env
[root@txy Python-3.6.8]# source /app/py36env/bin/activate
(py36env) [root@txy ~]# pip install ipython
(py36env) [root@txy ~]# pip freeze
(py36env) [root@txy ~]# pip install Django==2.0.5
(py36env) [root@txy ~]# python
>>> import django
>>> django.get_version()
'2.0.5'
>>> quit()
(py36env) [root@txy ~]# deactivate 退出env虚拟环境

2、Django初始化
[root@txy cmdb]# source /app/py36env/bin/activate
(py36env) [root@txy ~]# cd /root/cmdb/cmdbk
(py36env) [root@txy ~]# django-admin startproject cmdbk
(py36env) [root@txy cmdb]# python manage.py startapp user

cmdb/settings.py 主配置文件设置
INSTALLED_APPS = ['user'] 将user加入到INSTALLED_APPS中
ALLOWED_HOSTS = ['*'] 授权哪个域名可以访问

(py36env) [root@txy cmdb]# cat user/views.py # view 视图
#enconding: utf-8
from django.http import HttpResponse
def index(request):
    return HttpResponse('我的第一个app, ---->user')

(py36env) [root@txy cmdb]# cat user/urls.py # url子路由
from django.urls import path
from user import views
    urlpatterns = [
    path('index/', views.index, name='index'),    #/user/index/
]

(py36env) [root@txy cmdb]# cat cmdb/urls.py # url主入口路由
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('user/', include('user.urls')),
]

(py36env) [root@txy cmdb]# python manage.py runserver 0.0.0.0:8001   # 启动项目
[root@txy tmp]# curl http://192.168.1.118:8001/user/index/   #访问验证
我的第一个app, ---->user

3、加载template模板和json文件数据
基于以上做修改,
json(有格式的)字符串 =>dict
json str => json.loads() =>dict/list
dict/list => json.dumps() =>json str

(py36env) [root@txy cmdb]# cat /root/cmdb/cmdbk/user.data.json   #准备数据源

{
    "1":{"name":"testone", "age":28, "tel":"18781277763", "password":"key12", "sex": 1},
    "2":{"name":"testtwo", "age":28, "tel":"18781277763", "password":"key12"},
    "3":{"name":"test", "age":28, "tel":"18781277763", "password":"key12", "sex": 0},
    "4":{"name":"tone", "age":28, "tel":"18781277763", "password":"key12"},
    "5":{"name":"tee", "age":28, "tel":"18781277763", "password":"key12", "sex": 0},
    "6":{"name":"wone", "age":28, "tel":"18781277763", "password":"key12"}
}
user.data.json

(py36django2) [root@www cmdbk]# cat user/models.py # 创建模型

from django.db import models
import json
DATA_FILE = 'user.data.json'
def get_users():
    fhandler = open(DATA_FILE, 'rt')
    users = json.loads(fhandler.read())
    fhandler.close()
    return users

(py36env) [root@txy cmdb]# cat user/views.py #视图
#enconding: utf-8
from django.shortcuts import render
from .models import get_users
def index(request):
    return render(request, 'user/index.html',{
        'users': get_users()
    })
(py36env) [root@txy cmdb]# mkdir -p user/templates/user && vim user/templates/user/index.html  #静态页面展示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table border="1" cellspacing="0">
    <thead>
        <tr>
            <th>姓名</th>
            <th>年龄</th>
            <th>性别</th>
            <th>联系方式</th>
        </tr>
    </thead>
    <tbody>
    {% for id, user in users.items %}
      <tr>
        <td>{{ user.name }}</td>
        <td>{{ user.age }}</td>
        <td>
            {% if user.sex == 0 %}
                女
            {% else %}
                男
            {% endif %}
        </td>
        <td>{{ user.tel }}</td>
      </tr>
    {% endfor %}
    </tbody>
</table>
</body>
</html>
index.html

页面访问,出现表单展示。http://192.168.1.118:8001/user/index/

4、用户登录页面
打开登录页面
url => /user/login/
views => login,render(request, 'user/login.html') templates/user/login.html
urls.py => path('login/', views.login, name='login')

<form> input 用户名 input name 密码 input password submit </form>
action method
填写用户名和密码点击登录

(py36env) [root@txy cmdb]# cat user/templates/user/login.html #登录页面展示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
</head>
<body>
<form action="/user/valid_login/" method="GET">
    {% if errors %}
        {% for key, error in errors.items %}
            {{ error }} <br/>
        {% endfor %}
    {% endif %} 
    用户名: <input type="text" name="name" value="{{ name }}"/> <br/>
    密 码: <input type="password" name="password" /> <br/>
    <input type="submit" value="登录" /> <br/>
</form>
</body>
</html>

(py36env) [root@txy cmdb]# cat user/urls.py #路由展示

from django.urls import path
from user import views
#/user/index/
app_name = 'user'
urlpatterns = [
    path('index/', views.index, name='index'),
    path('login/', views.login, name='login'),
    path('valid_login/', views.valid_login, name='valid_login'),
]

(py36env) [root@txy cmdb]# cat user/views.py #视图

#enconding: utf-8
from django.http import HttpResponse
from django.shortcuts import render
from .models import get_users
from .models import valid_login as valid_login_func
def index(request):
    #return HttpResponse('我的第一个app, ---->user')
    return render(request, 'user/index.html',{
        'users': get_users()
    })

def login(request):
    return render(request, 'user/login.html')

def valid_login(request):
    # print(request.GET)
    name = request.GET.get('name')
    password = request.GET.get('password')
    user = valid_login_func(name, password)
    if user:
        return render(request, 'user/index.html', {'users': get_users()})
    else:
        return render(request, 'user/login.html', {
                'name': name,
                'errors': {'default': '用户名或密码错误.'}
        })

(py36env) [root@txy cmdb]# cat user/models.py #模型

from django.db import models
import json
DATA_FILE = 'user.data.json'
def get_users():
    fhandler = open(DATA_FILE, 'rt')
    users = json.loads(fhandler.read())
    fhandler.close()
    return users

def valid_login(name, password):
    users = get_users()
    for uid, user in users.items():
        if user['name'] == name and user['password'] == password:
            return True
    return False

访问:http://192.168.1.118:8001/user/login/, 输入json文件对应的用户名和密码。
输入账号密码正确则跳转index, 不正常则提示报错。

5、登录和Post提交
login.html做操作
<form action="/user/valid_login/" method="POST"> #get修改为post
此时提交会报403错误, CSRF问题。
解决方式1:settings.py, 注释CSRF
解决方式2:表单里面<form>下加入{% csrf_token %}
再次访问报其他错。
post方式,需要将views里面两个url合并成一个login url服务。

(py36env) [root@txy cmdb]# cat user/templates/user/login.html #页面,action,post,csrf

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
</head>
<body>
<form action="{% url 'user:login' %}" method="POST">
    {% csrf_token %}
    {% if errors %}
        {% for key, error in errors.items %}
            {{ error }} <br/>
        {% endfor %}
    {% endif %}
    用户名: <input type="text" name="name" value="{{ name }}"/> <br/>
    密 码: <input type="password" name="password" /> <br/>
    <input type="submit" value="登录" /> <br/>
</form>
</body>
</html>

(py36env) [root@txy cmdb]# cat user/views.py #视图,合并两个url

#enconding: utf-8
from  django.http import HttpResponse
from django.shortcuts import render
from .models import get_users
from .models import valid_login as valid_login_func

def index(request):
    return render(request, 'user/index.html', {'users': get_users()})

def login(request):
    if 'GET' == request.method:
        return render(request, 'user/login.html')
    else:
        name = request.POST.get('name')
        password = request.POST.get('password')
        user = valid_login_func(name, password)
        if user:
            return render(request, 'user/index.html', {'users': get_users()})
        else:
            return render(request, 'user/login.html', {
                'name': name,
                'errors': {'default': '用户名或密码错误.'}
            })			

(py36env) [root@txy cmdb]# cat user/urls.py # url清理

from django.urls import path
from user import views
app_name = 'user'
urlpatterns = [
    path('index/', views.index, name='index'),
    path('login/', views.login, name='login'),
    path('valid_login/', views.valid_login, name='valid_login'), ]

访问:http://101.34.54.32:8000/user/login/, url始终不变。

6、退出登录
主页面index.html,嵌入退出页面,
<a href="/user/logout/">退出登录</a>
<a href="{% url 'user:logout' %}">退出登录</a> #这两行任选其一。
<table border="1" cellspacing="0">

(py36env) [root@txy cmdb]# cat user/urls.py #添加url信息
    path('logout/', views.logout, name='logout'),

(py36env) [root@txy cmdb]# cat user/views.py #视图
from django.shortcuts import render, redirect
def logout(request):
    return redirect('user:login')

此时登录页面和首页均正常。

7、session状态

示意图,

 

以上页面可以登录访问,没有登录情况下,index首页也可以直接访问。

session在服务器端,存储在数据库,先要创建数据库信息。
(py36django2) [root@www cmdbk]# python manage.py migrate

首先viewss.py视图login函数添加session信息,退出清除session,访问验证session。

#enconding: utf-8
from django.http import HttpResponse
from django.shortcuts import render
from .models import get_users
from .models import valid_login as valid_login_func
from django.shortcuts import render, redirect

def index(request):
    if not request.session.get('user'):    #判断session信息
        return redirect('user:login')
    return render(request, 'user/index.html', {'users': get_users()})

def valid_login(request):
    # print(request.GET)
    name = request.GET.get('name')
    password = request.GET.get('password')
    user = valid_login_func(name, password)
    if user:
        return render(request, 'user/index.html', {'users': get_users()})
    else:
        return render(request, 'user/login.html', {
                'name': name,
                'errors': {'default': '用户名或密码错误.'}
        })

def login(request):
    if 'GET' == request.method:
        return render(request, 'user/login.html')
    else:
        name = request.POST.get('name')
        password = request.POST.get('password')
        user = UserValidator.valid_login(name, password)
        if user:
            request.session['user'] = user   #创建sessions
            return redirect('user:index')
        else:
            return render(request, 'user/login.html', {
                'name': name,
                'errors': {'default': '用户名或密码错误.'}
            })

def logout(request):
    request.session.flush()  # 清除单个用户, clear清除所有用户session
    return redirect('user:login')

然后models.py验证记录uid

from django.db import models
import json
DATA_FILE = 'user.data.json'
def get_users():
    fhandler = open(DATA_FILE, 'rt')
    users = json.loads(fhandler.read())
    fhandler.close()
    return users

def valid_login(name, password):
    users = get_users()
    for uid, user in users.items():
        if user['name'] == name and user['password'] == password:
            user['id'] = uid   #记录uid信息
            return True
    return False

页面访问,验证,只有登录之后才可以访问,退出后需要重新登录。

posted @ 2022-07-22 07:50  wang_wei123  阅读(499)  评论(0编辑  收藏  举报