1:介绍架构
通过 pycharm 创建 django 项目,或者直接通过 django-admin.py startproject HelloWorld 来创建项目都可以
生成目录为:
|-- HelloWorld 项目的容器
| |-- __init__.py 空文件
| |-- settings.py 项目配置(对于文件配置等)
| |-- urls.py url声明 主要是用作mvc中的c 控制器 控制页面跳转
| `-- wsgi.py
`-- manage.py 实用的命令管理工具 可以和django项目交互
正常情况下的交互流程如下图:
创建 APP 命令行内 python manage.py startapp myapp
这样 在 APP 文件夹内就包含了APP所有的内容
生成目录为:
|-- __init__.py #空文件
| |-- admin.py #空文件
| |-- models.py #业务 bean 的数据配置
| |-- tests.py
| `-- views.py #核心业务逻辑 与 url 交互切换网页
运行 django python manage.py runserver 127.0.0.1:8000 或者 在 pycharm上直接运行
2 django 模板标签
主要是在html上运行的使用标签
if/else 标签
基本语法格式如下:
{% if condition %}
... display
{% endif %}
for 标签
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
ifequal/ifnotequal 标签
{% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。
{% ifequal user currentuser %} 判断 user 和 currentuser 相同
<h1>Welcome!</h1>
{% endifequal %}
过滤器 模板过滤器可以在变量被显示前修改它,过滤器使用管道字符
{{ name|lower }} 变量被过滤器 lower 处理后,文档大写转换文本为小写。
过滤管道可以被* 套接* ,既是说,一个过滤器管道的输出又可以作为下一个管道的输入:
{{ my_list|first|upper }}
以上实例将第一个元素并将其转化为大写。
其他过滤器:
addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。
date : 按指定的格式字符串参数格式化 date 或者 datetime 对象,实例:
{{ pub_date|date:"F j, Y" }}
length : 返回变量的长度。
include 标签
{% include %} 标签允许在模板中包含其它的模板的内容。
如 {% include "nav.html" %}
模板继承:
{% block mainbody %} 所有的 {% block %} 标签告诉模板引擎,子模板可以重载这些部分。
<p>original</p>
{% endblock %}
{% extends "base.html" %} 这里是继承的部分、
3 django 模型
Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。
定义模型 django 规定,如果要使用模型,必须先创建一个APP 命令为 python manage.py startapp TestApp
创建出的模型如 上面介绍的创建APP 一样
在 models 中
class Test(models.Model):
name = models.CharField(max_length=20)
以上的类名代表了数据库的表名,且继承了models.Model,类里边的字段代表了数据库的字段,类型则由CharField(相当于 varchar2) DateField(相当于datetime)
max_length 来限定长度
然后 在setting.py 中,找到 INSTALLED_APPS 中 将创建的APP 名称添加进去 在命令行中 python manage.py syncdb 可以看到 Create table 字样,说明表创建成功
表名组成结构为:app名_类名(如:TestModel_test)
数据库操作:
添加数据: uu = models.UserInfo(user='测试数据',pwd='1234') uu.save()
获取数据:
# 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
list = Test.objects.all()
# filter相当于SQL中的WHERE,可设置条件过滤结果
response2 = Test.objects.filter(id=1)
# 获取单个对象
response3 = Test.objects.get(id=1)
#数据排序
Test.objects.order_by("id")
# 上面的方法可以连锁使用
Test.objects.filter(name="w3cschool.cc").order_by("id")
更新数据:
# 方法1
修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
test1 = Test.objects.get(id=1)
test1.name = 'w3cschool菜鸟教程'
test1.save()
# 方法2
#Test.objects.filter(id=1).update(name='w3cschool菜鸟教程')
修改所有的列
# Test.objects.all().update(name='w3cschool菜鸟教程')
删除数据:删除数据库中的对象只需调用该对象的delete()方法即可
方法1:
test1 = Test.objects.get(id=1)
test1.delete()
方法2:
# Test.objects.filter(id=1).delete()
# 删除所有数据
# Test.objects.all().delete()
4 django 表单
Request 对象:
path:请求页面的全路径
method:请求中的方法
if request.method == 'GET':
GET:获取请求参数的对象
username = request.POST.get('username',None)
COOKIES 包含所有cookies的标准Python字典对象。Keys和values都是字符串。
FILES :包含所有上传文件的类字典对象。FILES中的每个Key都是<input type="file" name="" />标签中name属性的值
包含下面三个Keys:
filename: 上传文件名,用Python字符串表示
content-type: 上传文件的Content type
content: 上传文件的原始内容
注意:只有在请求方法是POST,并且请求页面中<form>有enctype="multipart/form-data"属性时FILES才拥有数据。否则,FILES 是一个空字典。
META:包含所有可用HTTP头部信息的字典。
meta =
REMOTE_ADDR: 客户端IP地址
REMOTE_HOST: 客户端主机名
SERVER_NAME: 服务器主机名
SERVER_PORT: 服务器端口
META 中这些头加上前缀HTTP_最为Key, 例如:
HTTP_ACCEPT_ENCODING
HTTP_ACCEPT_LANGUAGE
HTTP_HOST: 客户发送的HTTP主机头信息
HTTP_REFERER: referring页
HTTP_USER_AGENT: 客户端的user-agent字符串
HTTP_X_BENDER: X-Bender头信息
user:是一个django.contrib.auth.models.User 对象,代表当前登录的用户。
session 唯一可读写的属性,代表当前会话的字典对象。只有激活Django中的session支持时该属性才可用
raw_post_data 原始HTTP POST数据,未解析过。 高级处理时会有用处。
Request对象也有一些有用的方法:
方法 描述
__getitem__(key) 返回GET/POST的键值,先取POST,后取GET。如果键不存在抛出 KeyError。
这是我们可以使用字典语法访问HttpRequest对象。
例如,request["foo"]等同于先request.POST["foo"] 然后 request.GET["foo"]的操作。
has_key() 检查request.GET or request.POST中是否包含参数指定的Key。
get_full_path() 返回包含查询字符串的请求路径。例如, "/music/bands/the_beatles/?print=true"
is_secure() 如果请求是安全的,返回True,就是说,发出的是HTTPS请求。
5 django 管理工具 admin
Django自动管理工具是django.contrib的一部分。你可以在项目的 settings.py 中的INSTALLED_APPS看到它:
激活管理工具 urls.py 中 (r'^admin/', include(admin.site.urls)),
使用管理工具 http://yoursite:8000/admin/
创建用户: python manage.py createsuperuser
注册模型到 admin 就是 models 中的bean 模型 在 admin.py 中添加:admin.site.register(Test) 就可以在页面看到
pycharm创建一个简单的django的模拟登陆
1:创建django项目
创建模拟登陆APP模型
命令行: python manage.py startapp LoginApp
对应目录,这里可以看到,views 是核心业务逻辑实现,admin 属于管理器中的注册工具,models是数据模型,映射到数据库的表上,tests 属于测试部分
模拟登陆
在 http:127.0.0.1:8000/login 中出现登录界面 由views.firstPage 方法来实现并跳转到login.html页面
html页面为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录界面</h1>
<form action="/loginOk/" method="post"> <!--- 点击登陆了后 去 urls 查找 loginOk 的业务逻辑--->
账号:<input type="text" name="username">
密码:<input type="password" name="passwd">
<input type="submit" value="登录">
</form>
</body>
</html>
页面跳转控制 :
在 urls.py 中添加代码如下
from django.conf.urls import include, url
from django.contrib import admin
from LoginApp import views
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
#登录初始界面
url('login',views.firstPage),
#登录成功后跳转界面
url('loginOk',views.login),
#展示render 传参界面
url('listUser',views.listUsers)
]
views.py
from django.shortcuts import render
from django.shortcuts import HttpResponse
from LoginApp import models
import traceback
# Create your views here.
listUser=[{'username':"yang","passwd":"123"},{'username':'shu','passwd':'456'}]
def login(request):
try:
print("path = %s "%request.path) #测试 request path
print(" meta = %s "%request.META) #测试 request meta
username = request.POST.get('username',None)
passwd = request.POST.get('passwd',None)
print('用户登录的账号:%s 密码 %s '%(username,passwd))
#uu = models.UserInfo(user='测试数据',pwd='1234') #另一种添加到数据库的方式
#uu.save()
user_list = models.UserInfo.objects.all() #获取数据库的UserInfo表的所有信息
for user in user_list:
if username == user.user and passwd == user.pwd: # 如果检查出用户登录的账号在数据库存在 跳到 userExit.html 中 同时将该user作为参数传入页面
print('检查用户账号密码....')
return render(request,'userExit.html',{'user':user})
#页面通过django模板标签获取数据user 这里的标红 user 随意取, 和 html 中的标签内的值要一致
#关键在这里 render方法 接受的第三个参数是后台返回给浏览器的数据,它是一个字典,user为自定义指针的名称
models.UserInfo.objects.create(user=username,pwd=passwd)
if username =="guo": # 如果名称是guo 并且该用户在数据库user表信息不存在,测试传参 user_list 在页面打印出信息
return render(request,'sucess.html',{'data':user_list})
else:
return render(request,'loginError.html') #测试到登录错误的界面
except Exception:
traceback.print_exc("从数据库取数据出现异常") #可以查看出第几行处理异常
return render(request,'error.html')
#初始化登录
def firstPage(request):
return render(request,"login.html")
#测试传参
def listUsers(request):
print('开始传值:',request)
return render(request, "listUser.html", {"data":listUser})
login.html 登录后 通过 action跳转到 loginOk,就是 urls.py 中对应的核心逻辑 views.login 方法上,login方法通过request获取一系列数据,并且要想添加数据库的支持,
本章节仅测试 sqlite3 即 django自带轻量级数据库
接下来配置数据库信息: setting.py
首先注册 app
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'LoginApp' # App的名称 不注册的话,数据库就不知道该给哪个APP创建表
)
# Database 然后还是 setting.py 配置相关数据库参数 这里还可以配置 mysql oracle postgresql 等数据库信息
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
编辑 models.py
from django.db import models
"""
业务 bean
数据库配置 这里创建一个用户表 字段为 user 和 pwd 分别作为用户名和密码
"""
# Create your models here.
class UserInfo(models.Model): # 继承 models.Model 固定写法
user = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
接下来通过命令来创建表
python manage.py makemigrations
相当于 在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py, 但是这个改动还没有作用到数据库文件
再输入命令:python manage.py migrate
将该改动作用到数据库文件,比如产生table之类,然后 数据库中的表就创建成功了。
访问表的信息再 views 中的 login 函数有详细说明
这里仅对于userExit.html 展示下django模板标签的使用:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>用户已存在</h1> 账号:{{ user.user }} <!--- 这里可以直接拿 user来用,这里的suer对应的就是views 中login 函数中标红的 user ---> 密码:{{ user.pwd }} </body> </html> 同时其他类型的标签有listUser.html 中的
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table border='1'> <thead> <th>用户名</th> <th>密码</th> </thead> <tbody> {% for m in data %} <!--- for循环标签 ---> <td>username = {{m.username}}</td> <td>passwd = {{m.passwd}}</td>< </tr> {% endfor %} </tbody> </table> </body> </html>
ok 基本的模拟登陆就在这里了,其他问题下次再详谈