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"} }
(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>
页面访问,出现表单展示。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
页面访问,验证,只有登录之后才可以访问,退出后需要重新登录。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
2019-07-22 Django模型之Meta常见选项