django 基础
1. 安装django:
python -m pip install django (用pip安装),在python安装目录 scripts里就会有一个django-admin.py
2. 创建一个project:
django-admin startproject guest2 #执行完后在对应目录下就生成了一个guest2目录,里面包含一些目录和文件,settings.py是主配置文件,urls.py是路由文件,
3. 创建一个应用:
cd guest2
python manage.py startapp sign
sign下面的文件分别是:
admin.py: django 自带了admin 后台, 把models里面的表映射到后台管理.
apps.py:应用的配置, 虫师都没用过
models.py: ORM:映射数据库,创建和管理数据库表的文件 (编程语言 ---> 数据库驱动(pymysql) --->数据库)
tests.py: 写单元测试的
views.py: 写django功能的处理逻辑
4. 启动创建的项目:
python manage.py runserver
5.访问方法:
6. 应用,index page
a. 通过表单或链接发送请求
<a href = "/admin/">go back to admin</a>
b. 指定路径
c. 打开url 配置文件settings.py
INSTALLED_APPS里需要加上创建的项目名,如sign
ROOT_URLCONF = 'guest2.urls' 通过 这个匹配路径解析
d. 通过urls.py文件找到views (视图),但先要导入views: from sign import views,然后再加path:
path ('index/', views.index)
e. views.py里创建一个index 函数, return HttpResponse ("login ok") 对象或者return render(request, "index.html")
7. html里的form表单有个action 属性,可以指定一个action:
<form action="/login_action/">
这时候再点击login button的话,可以看到url变成了/login_action/
所以这时候可以像index 一样,add a path, view.login 函数
8. def index(request): request:接收客户端的所有请求
可以在函数里用:
login_username = request.GET.get("username")
login_password = request.GET.get("password")
print(login_username)
print(login_password)
取到了username和password
9. django里面对字典的处理:
在函数里处理返回信息用如下方式:
return render(request, "index.html", {"error": "username or password is empty."})
这时候需要在html里面加上{{error}},才可以接收显示这个信息。
10. get请求不安全,username和password会显示在url上,所以最好用post请求:
<form action="/login_action/" method="post">
函数里面也改成POST请求
login_username = request.POST.get("username")
在用post请求的时候,可能提示forbidden about CSRF,解决方法:
1.可以在settings.py里的MIDDLEWARE注释掉
2.可以在HTML里加上{% csrf_token %}
11. 如果想什么也不输也返回一个页面,可以在urls里加path('', views.index)
12.也可以用return HttpResponseRedirect("/event_manage/")的方法返回一个地址
13.设置cookie (不安全):
response= HttpResponseRedirect("/event_manage/")
response.set_cookie('username', login_username, 100)
return response
username = request.COOKIES.get("user", '') #读取浏览器
14. 设置session(安全), 需要创建database, session存在database中
settings.py里面的INSTALLED_APPS里面已经有的一些表,只是需要用命令生成一下
用命令python manage.py migrate 可以生成settings.py里的那些表.
request.session['user'] = login_username
username = request.session.get("user", '')
15. 创建用户:
python manage.py createsuperuser
这时候可以login /admin/页面了, login后可以add user..
新加的用户没有权限login,需要check Staff status 即可。
16. from django.contrib import auth 导入认证模块
auth.login(request, user)
但退出后cookie也不删,需要加上:
@login_required 这样即可
17. ORM:Object Relational Mapping, 是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 [1] 。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”, 在django里面就有ORM, 正常情况下编程语言和数据库之间需要通过数据库驱动来关联, python里就是pymysql,但写代码的话还是SQL语句, 像select ...from ... where ...但是因为有了ORM,所以可以用编程语言直接创建数据库, 用class xxxx(models.Model) 创建类来实现.
18. MTV: Models(数据库) , template, views(视图)
django 提供完善的模型model层主要用来创建和存取数据,不需要 我们直接对数据库操作。
django模型基础知识:
每个模型是一个python类,继承django.db.models.model类。
该模型的每个属性表示 一个数据库表字段,所有这一切,已经给你一个自动生成数据库访问的API.
打开../sign/models.py文件,完成表的创建
19. 创建models里的数据库:
需要安装pymysql: python -m pip install pymysql
class Event(models.Model):
name=models.CharField(max_length=100) #标题
limit=models.IntegerField() #限制人数
status=models.BooleanField() #状态
address=models.CharField(max_length=200) #地址
start_time=models.DateTimeField() #日期
create_time=models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
然后用python manage.py makemigrations sign
python manage.py migrate
去创建数据库
20. 在admin.py里需要导入创建的两个表:
from sign.models import Event, Guest
admin.site.register(Event) #把表注册到后台
admin.site.register(Guest)
这时在/admin/ page就可以看到这两个表,但是如果添加记录的话显示的是对象,如果想显示成数据库记录,需要创建一个类:
class EventAdmin(admin.ModelAdmin):
list_display=['name', 'limit', 'status','address', 'start_time']
search_fields=['name']
list_filter = ['status']
class GuestAdmin(admin.ModelAdmin):
list_display=['realname', 'phone', 'email', 'sign', 'event']
search_fields=['realname','phone']
list_filter = ['sign']
admin.site.register(Event, EventAdmin)
admin.site.register(Guest, GuestAdmin)
21. 数据库的增删改查:
django需要进入shell 模式:
python manage.py shell
from sign.models import Event, Guest
Event.objects.all() #查所有记录
增加一条记录:
e1 =Event(id=3, name='hongmi8', limit=2000, status=True, address='Beijing',start_time=datetime(2018,5,22,14,00,00))
e1.save()
删除记录:
e1=Event.objects.get(name_contains='heimi')
e1.delete()
查询记录:
e2=Event.objects.filter(name='meizu')
e2
e2.address
e3=Event.objects.filter(name__contains="发布会") # 模糊查询__contains
len(e3)
for e in e3:
e.name
更新记录:
e1=Event.objects.get(name='Huawei')
e1.name='MiNote5'
e1.save()
g3=Event.objects.select_for_update().filter(name='Minote5')
g3.update(name='haha')
22. 数据库切换:安装wampserver, login: http://localhost/phpmyadmin (root, 空)
先创建一个数据库: guest
然后在项目下创建一个my.cnf:
[client]
host=127.0.0.1
port=3306
database=guest
user=root
password=''
default-character-set=utf8
在settings.py里添加DATABASE改成mysql的:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'OPTIONS': {
'read_default_file': os.path.join(BASE_DIR,'my.cnf'),
},
}
}
在项目下面的__init__.py里加上:
import pymysql
pymysql.install_as_MySQLdb()
可以直接连mysql数据库了
现在可以执行python manage.py migrate去创建数据库了,执行完刷新mysql,
还需要执行python manage.py createsuperuser创建 admin
最好安装一个mysql客户端,如mysqlyog ultimate
22. bootstrap:https://v3.bootcss.com/getting-started/#download/
提供CSS样式
可以copy 网上的代码。
django还有个bootstrap 库, 用python -m pip install django-bootstrap3安装
23.应用bootstrap3:
1.在settings.py里添加:"bootstrap3"应用
2.在index.html里添加:bootstrap3,引用bootstrap3样式:
在<head>里添加:
{% load bootstrap3 %}
{% bootstrap_css %}
24.分页器:
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger.
25. django test:
django的TestCase是继承的unittest.TestCase, 不需要用unittest.main()方法去执行测试,
tests.py里写单元测试:
django里有一个client类,可以模拟客户端的http的get 和post请求,所以在单元测试的时候会用到.
如下:
class IndexPageTest(TestCase):
def test_index(self):
response = self.client.get('/index/')
self.assertEqual(response.status_code, 200) #200说明成功获取到了index页面
self.assertTemplateUsed(response, 'index.html') #断言template返回的是index.html页面, 是django里面特有的。
测试的时候用: python manage.py test
测试login success,返回的应该是302页面而不是200,因为login success会有一个跳转,跳转就是302
django运行单元测试的时候不会真的去查database, 所以需要初始化数据:
django.contrib.auth.models import User #需要用的表是auth.models下面的user表
需要用setUp 和tearDown 初始化:
def setUp(self):
User.objects.create_user("admin", "admin@123.com", "admin123456") #创建一个user
def test_login_success(self):
user_info={“username": "admin", "password":"admin123456"}
response = self.client.post('/login_action/', data =user_info)
self.assertEqual(response.status_code, 302)
def test_login_user(self):
user=self.client.get(username = 'admin')
self.assertEqual(user.username, admin)
self.assertEqual(user.email, 'admin@123.com')
def test_login_user_null(self):
response=self.client.post('/login_action/', {'username': '', 'passowrd': ''}
self.assertEqual(response.status_code, 200)
self.assertIn(b"username or password null", response.content)
还可以测username or password ==error
测event_manage的时候,正常情况下是有跳转的,如果没有login的话会返回到index页面,所以执行会报错,说是302,而不是200,是因为这个方法是@login_required的,如果把这个注释掉就可以运行成功,但是这样会很麻烦,所以需要有一个初始化一个user数据,就是在setUp里加上创建user,然后再做一个预先login的处理才行。
def setUp(self):
User.objects.create_user("admin", "admin@123.com", "admin123456")
Event.objects.create(name='xiaomi6', limit=2000, address='beijing'
login_user={'username':'admin, 'password':'admin123456'}
self.client.post('/login_action/', data=login_user)
def test_event_manage(self):
response=self.client.post('/event_manage/')
self.assertEqul(response.status_code, 200)
self.assertIn(b"xiaomi6', response.content)
django rest framework: 快速开发接口的平台。
浙公网安备 33010602011771号