django学习
前端效果不想写,可以去jq22.com下载。
若数据库使用MySQL,在setting同级目录下__init__文件中添加:
import pymysql
pymysql.install_as_MySQLdb()
一、获取django
安装django:
pip install django
创建一个django项目:
django-admin startproject [your project Name]
在创建的项目目录下创建自己的APP应用:
python manage.py startapp [your app Name]
运行项目:
python manage.py runserver
当运行其他人的项目或者迁移项目时,迁移数据库:
python manage.py makemigrations
python manage.py migrate
出现下图即为运行成功:
二、django项目目录介绍
如下图所示:
settings.py保存django的配置信息,列如数据库和HTML的存放目录(见下图):
可以从注释中的链接查看官方文档,获取写法。
DIRS便是存放html的目录。
urls设置路由,当浏览器访问时,首先调用此文件,按照请求路径进行匹配。
以上是django的主目录,下面创建一个应用,即真正需要我们实现业务逻辑的位置
migrations是存放关于生成数据库表的目录,在执行
python manage.py makemigrations
python manage.py migrate
时自动生成。
views.py写业务逻辑。
models.py模型是关于您的数据的单一的、确定的信息来源。它包含您存储的数据的基本字段和行为。通常,每个模型映射到单个数据库表。
admin是django自带的用来让你进行数据库管理的web app.提供了很多定制化功能,你甚至可以用它来进行公司内部的内容管理。
HttpResponse
1.下载
def download(request):
f = open(r"path")
response = HttpRespose(f.read(), content_type = "(此处根据你的文件格式查询MIME)")
response['Content-Disposition'] = 'attachment;filename="NAME.后缀"'
return response
2.重定向
HttpResponseRedirect(‘路径’)
views中
类方式
from django.views import View
class Demo(View):
def get(self, request):
return HttpResponse('babababa...')
在urls中,path(‘path’, views.mothed) mothod只能是方法,直接写Demo会报错,应该path(‘path’, views.mclass.as_view())
settings.py介绍
数据库连接
数据库设置必须配置默认数据库;也可以指定任意数量的附加数据库。
DATABASES = {
'default': { #默认数据库
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
当连接到其他数据库后端(如MariaDB, MySQL, Oracle, or PostgreSQL)时,将需要额外的连接参数。有关如何指定其他数据库类型,请参阅下面的 ENGINE设置。本示例用于PostgreSQL:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql', #根据不同数据库更改
'NAME': 'mydatabase', #连接到的创建的数据库名字
'USER': 'mydatabaseuser', #数据库登录名
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1', #数据库地址
'PORT': '5432', #数据库端口
}
}
ENGINE
- ‘django.db.backends.postgresql’
- ‘django.db.backends.mysql’
- ‘django.db.backends.sqlite3’
- ‘django.db.backends.oracle’
静态文件
在django中,静态文件为CSS、JS、Image。在srttings.py文件中,设置属性为:
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
STATIC_URL = '/static' #请求url路径
STATICFILES_DIRS = [BASE_ DIR / 'path',] #静态文件在项目中的路径
views.py
from django.shortcuts import render,HttpResponse
def OurMothedName(request):
return HttpResponse("Your String")
def render_Test(request): #必须要有request参数
return render(request, 'our_html.html')
HttpResponse一般用来直接返回字符串,当然也可以返回类似这样:"<h1>html字符串</h1>",浏览器会自动解析。
render则用来返回一个html文件。
request参数
包括了一些请求信息。常用属性:
- mothed
- POST
request.mothed是一个字符串,表示浏览器请求方式,一般有:
request.mothed
- GET
- POST
- PUT
- DELETE
- HEAD
- PATCH
- OPTIONS
- TRACE
request.POST是一个字典,可以用浏览器传过来的参数名获取:
request.POST['username']
models.py
from django.db import models
class User_Table(models.Model): #必须继承models.Model
uesrname = models.CharField(max_length = 64)
password = models.CharField(max_length = 64)
一个类就代表了一张表,里面的属性代表了字段,像username便是创建了一个最大长度为64的字符字段。
现在数据库还是没有的,需要执行数据库迁移命令:
python manage.py makemigrations
python manage.py migrate
执行完成后,数据库就改完了。
Django模板系统
在上面settings.py中曾提到模板属性作用,这里的模板也是与html相关联的。有两种特殊符号{{ }}和{% %},如果学过jsp可能更能体会到相似。
{{ }}表示变量,在模板渲染时替换成值。{% %}表示逻辑相关的操作。点 . 用来获取对象属性。
比如在html中:
<body>
{{ var_name }}
</body>
在渲染时便可替换:
def RenderHtml(request):
return render(request, 'html.html', {'var_name' : value,})
若变量为一个列表,可以在在HTML中直接“变量名.索引”:
var_name.0 等价于在python中var_name[0],若为字典,则“变量名.key”即可。 html中 . 后面可以加方法,不加括号,既然不能加括号,那么便无法传递参数,所以自定义方法不能加参数。 若字段冲突,.会按照:“字典关键字查询、属性方法名查询、按数字索引查询”这种顺序查询。
过滤器
{{ 变量名|filter_name:参数}}
“:”左右不加空格。
自定义过滤器
- 在app下创建一个名为templatetags包(包的名字不能错)
- 创建一个python文件,文件名自定义(mytags.py)
- 在python文件中写:
from django import template
register = template.Library() #register名字不能错
- 写函数+装饰器
函数只能有一个或两个参数,第一个表示变量,第二个表示给过滤器的参数。
@register.filter
def demo_mothed(value, arg):
return "随便"
在模板中使用:
{% load mytags %}
{{ var_name|demo_mothed:par }}
母板和继承
可以继承一个html。
{% entends 'extend.html' %}
<!--'extend.html'带引号,否则会被当成一个变量,若作为变量使用,可以在后台控制页面继承某个母版 -->
{% block block_name %}
<!-- 这里写自己的代码 -->
{% endblock %}
<% include 'content.html'%>
<!-- 包含过来 -->
母板包含页面公共部分,定义多个block块供子页面覆盖。
Cookie登录后保存登录状态
cookie保存在本地的一组键值对。
def login(request):
if request.mothed == 'POST':
user = request.POST['user']
pwd = request.POST['password']
if user == 'bla' and pwd == 'lalala':
ret = redirect('direct.html')
ret.set_cookie('key', 'value')
return ret
return render('login.html ')
装饰器
DRF,restful理念框架
新建一个serialzers.py
from rest_framework import serializers
from .models import modelName
class modelNameSerializer(serializers.ModelSerializer):
class meta:
model = modelName #指定序列化从哪个模型映射字段
fileds = '__all__' #映射哪些字段
在view.py中
from rest_framework.viewsets import ModelViewSet
from .serialzers import modelNameSerializer
class Mclzz(ModelViewSet):
#指定查询集
queryset = modelName.objects.all()
#指定序列化器
serializer_class = modelNameSerializer
在urls.py中,原本的urlpatterns都不用再写。
from rest_framework.routers import DefultRouter
from . import views
urlpatterns = []
router = DefultRouter()
router.register(r'', views.Mclzz)
urlpatterns += router.urls
Serializer构造方法:Serializer(instance=None,data=empty, **kwarg)
将模型传入,便是将模型转换为字典:Serializer(modelClassIntance)。
将json数据传入,便是反序列化,即可将json转换为模型。
序列化器中字段个数可以与models中不同但是存在字段名称必须相同。
反序列化
反序列化之前,需要调用is_valid()校验,若正确,则返回True,errors:返回字典,包含错误信息。验证成功,validated_data返回数据。
当然,在调用校验时指定参数is_valid(raise_exception=True),便会直接抛出异常并打印错误信息。
校验完成后,调用save()方法。会执行序列化器的create或丿update方法。
额外追加校验逻辑
在序列化器类中中定义方法validate_ + ‘想额外校验的字段名’ :
from rest_framework import serializers
class clzz(serializers.Serializer):
name = serializers.CharField(max_length = 64)
#validate_字段名
def validate_name(self, value):
#value是值
if 'ss' not in value.lower():
raise serializers.ValidationError("ss不存在")
return value
#联合校验
def validate(self, attrs):
#attrs是前端传过来的字典
return attrs
#也可以在定义字段中指定validator参数
password = CharFeild(max_length = 32, validator = [check_function])