博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django
阅读量:4916 次
发布时间:2019-06-11

本文共 19379 字,大约阅读时间需要 64 分钟。

昨日内容回顾纯手撸简易版的web框架HTTP协议:规定了客户端与服务端消息传输的格式四大特性:1.基于tcp/ip协议,作用于应用层的协议2.基于请求响应3.无状态4.无连接请求消息格式请求手首行请求头(一大堆kv键值对)请求体(post请求携带的数据)响应消息格式响应手首行响应头(一大堆kv键值对)响应体(post请求携带的数据)响应状态码1xx:服务端已接收到你的数据了,正在处理,你可以继续提交2xx:请求成功,返回相应资源3xx:重定向4xx:请求资源不存在5xx:服务器内部错误想根据用户访问的不同路径返回不同的页面手动对http请求格式的数据进行切分等一系列处理获取到用户访问的路径后端逻辑判断借助于wsgiref帮助我们处理socket以及http数据动态展示当前时间后端利用字符串的替换html中特殊符号的部分基于jinja2完成模板渲染后端:user_dic={‘name’:'jason',"password":'123'}前端:{
{user_dic}}{
{user_dic.name}}{
{user_dic['name']}}{
{user_dic.get('name')}}ps:jinja2提供了和python后端几乎一样的操作数据的方式 (django有些不支持)后端:user_list=[{},{},{}]前端:{% for user_dict in user_list %} {
{user_dic}}{% endfor %}{
{}}:跟变量相关{%%}:跟逻辑相关动静态网页静态网页:数据是写死的,万年不变动态网页:数据是动态获取的,可以是当前的时间,也可以是数据库数据python三大主流web框架:django:flask:tornado:a:socketb:路由与视图函数对应关系c:模板渲染django:a别人的b,c自己写的flask: b是自己的,a,c都是别人的tornado:都是自己写的django版本问题:推荐使用1.11确保django能够正常启动需要注意1.计算机的名称不要有中文2.项目名不要起中文3.一个pycharm窗口就只放在一个工程(项目)安装命令行 pip3 install django==1.11.11测试是否安装成功 django-admin创建django项目 django-admin startproject 项目名称(不要用中文) 项目名文件夹(注意是项目,不是应用) __init__.py settings.py 配置文件(这是暴露的配置文件(你可以配置),说明django内部有自己大的文件配置) urls.py 路由与视图函数对应关系 wsgi.py manage.py 创建app python3 manage.py startapp 应用名 应用名文件夹 __init__.py admin.py (django后台管理所有的模型表都注册的话,可以对其增删改查(就不用到数据库修改),例如博客园的随笔管理) models.py (所有的class都放在里面) views.py (所有的视图函数)(视图函数并不只是函数,有可能是类,只要是处理后端逻辑的) 启动django python3 manage.py runserver 停止django项目 ctrl+c 命令行创建不会自动创建templates文件夹 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] #配置路径 , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, },]pycharm new project 选django 选本机解释器 勾选admin后台管理 两种创建app的方式 完整的命令 manage task 简便命令 小绿色往右点击自动启动 edit conf.....可以修改端口号app的概念一所大学里面有很多学院,每一个学院都有自己独特的功能注意新创建的app需要在配置文件中注册才能生效(*******************)INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config' # 可以用全称 'app01' # 也可以简写]ps:pycharm能自动帮你创建一个app并自动注册到配置文件中django小白必会三板斧HTTPResponse:返回字符串render:返回html并且支持模板渲染redirect:重定向即可以重定向到别人的网址也可以定向到自己的今日内容:手把手带你写登录功能pycharm 连接数据库orm简单操作图书馆里系统表分析登录功能1.路由访问如果不加斜杠 会内部自动重定向加斜杠的路由所有的html文件默认都写在templates文件夹下所有的静态文件(css,js,前端第三方类库默认都放在static文件夹)# html页面引入外部资源的方式cdn本地 (在服务端)bootstrap在服务端本地,但是发给html页面给浏览器就访问不到你服务端本地的了,除非你给我路径去查找,不然你写的文件夹路径,只能服务端你自己可以访问静文件配置STATIC_URL = '/static/'静态文件配置STATICFILES_DIRS=[ os.path.join(BASE_DIR,'static')]暴露给外界能够访问服务器静态文件夹下面所有的资源STATC_URL='/xxx/' #跟你的静态文件夹的名字一点关系都没有#静态文件配置STATIC_URL = '/static/'STATICFILES_DIRS=[ os.path.join(BASE_DIR,'static'), #就是你的静态文件夹静态路径 os.path.join(BASE_DIR, 'static1'), os.path.join(BASE_DIR, 'static2')]# # ps:会依次查找列表中所有的静态文件路径 找到的话立刻停止,都没有找到返回404每一个app都有自己的tmaplate css等form表单触发数据的动作两种方式

models

from django.db import models# Create your models here.class User(models.Model):    # user表的主键字段名就是id    id = models.AutoField(primary_key=True)    # varchar (32) name 字段是varchar(32) CharField在定义的时候必须是加max_length参数    name = models.CharField(max_length=32)    password = models.CharField(max_length=16)    addr = models.CharField(max_length=32, default='China')    def __str__(self):        return self.nameclass Book(models.Model):    # id可以不写,会自动创建    title = models.CharField(max_length=32)    price = models.DecimalField(max_digits=8, decimal_places=2)    # 一对多外键字段建立    publish = models.ForeignKey(to="Publish",on_delete=models.CASCADE) #默认是与publish表的id字段建立关联    # 默认是与publish表的id字段建立关联   外键字段名,orm会在自动在字段名后面加_id(查看数据库)(所以不要写publish_id)    # 多对多外键字段建在关联的两张表的任何一张表里面都可以,建议你建在查询频率比较高的那张表里    author = models.ManyToManyField(to='Author')  # django 会自动帮你创建book与author表的第三张表    # 多对多字段不会显示在表的字段中class Publish(models.Model):    name = models.CharField(max_length=32)    email = models.CharField(max_length=32)class Author(models.Model):    name = models.CharField(max_length=32)    age = models.ImageField()

views

from django.shortcuts import render,HttpResponse,redirectfrom app01 import models# Create your views here.import pymysqldef logins(request):    # return HttpResponse('login')    #获取用户端提交的请求方式    print(request.method)    #post 请求会报错,就要到settings中将某个东西注掉   拿到请求方式是全大写的    # if request.method == 'GET':    #     return render(request,'logins.html')    # elif request.method == 'POST':    #     return HttpResponse('来了,laodi')    # < QueryDict: {'username': ['jason'], 'password': ['123']} >    # < QueryDict: {'username': ['yaya', 'yaya'], 'password': ['123']} >    if request.method == 'POST':        # 获取用户输入的用户名和密码        username=request.POST.get('username')        password=request.POST.get('password')        conn = pymysql.connect(            host='127.0.0.1',            port=3306,            user='root',            password='123',            database='day55',            charset='utf8',            autocommit=True        )        cursor = conn.cursor(pymysql.cursors.DictCursor)        cursor.execute("select * from app01_user where name=%s and password=%s",(username,password))        user_info=cursor.fetchall()        print(user_info)        if user_info:            return HttpResponse('登录成功')        print(request.POST)  #你就把它当成一个大字典里面存放了客户端post提交的所有提交数据        # request.POST:< QueryDict: {'username': ['jason'], 'password': ['123']} >        print(request.POST.get('username'))  # value 虽然是个列表但是获取的value 的时候拿到的是单个元素        # # 默认只会取value列表里面的最后一个元素        # print(request.POST.getlist('username'))  # 要想一次性获取value列表里面所有的数据需要用getlist()        #要想一次性获取value列表里面的所有数据要用getlist()        print(request.POST.getlist('name'))#不推荐使用该        print(request.POST['password'])        print(request.GET) #get请求数据的方式跟post请求完全一样  
# 获取get请求数据的方式跟post请求完全一样!!! return HttpResponse('ok') return render(request,'logins.html')def reg(request): if request.method == 'POST': #获取用户输入的用户名和密码 username=request.POST.get('username') password=request.POST.get('password') #操作数据库user表 #方式1 user_obj = models.User.objects.create(name=username,password=password) #方式2: user_obj = models.User(name=username,password=password) user_obj.save()#对象用save方法保存到数据库 print(user_obj.pk) #获取主键值,无论你的主键字段叫什么名字 print(user_obj.password) # 获取用户数据的password值 print(user_obj.name) #获取用户数据的name值 #内部重定向,可以写别人的网址,也可以自己的网址 return redirect('/user') return render(request,'reg.html')def user(request): #获取数据库数据 user_list = models.User.objects.all() #select id,name,password from User print(user_list.query) #只要是QuerySet就可以点query查看获取到当前query对象的内部sql语句 for user_obj in user_list: print(user_obj.pk,user_obj.name) # return HttpResponse('ok') return render(request,'user.html',locals())def delete_user(request): #从get请求携带的参数中获取用户想要删除的信息id delete_id = request.GET.get('delete_id') # res=models.User.objects.filter(id=delete_id).first() models.User.objects.filter(id=delete_id).delete() #会将queryset所有对象全部删除 # res=models.User.objects.filter(id=delete_id)[0] # print(res) #相当于
]> # print(res.query) # print(type(res)) return redirect('/user')def edit(request): if request.method == 'POST': print(request.GET) print(request.POST) username= request.POST.get('username') password = request.POST.get('password') #获取用户想要修改用户的的数据id edit_id = request.POST.get('edit_id') edit_id= request.GET.get('edit_id') #将该数据查询出来渲染到一个编辑页面 #查询数据方式一 # user_query = models.User.objects.filter(id=edit_id).first() #查询数据方式2 # user_obj = models.User.objects.get(id=edit_id) #用get可以直接获取到数据对象本身 # print(user_query.type(user_query)) # return HttpResponse('edit') # 更新数据库 models.User.objects.filter(id=edit_id).update(name=username,password=password) return redirect('/user') #获取用户想要修改的数据的id edit_id = request.GET.get('edit_id') #将该数据查询出来渲染到一个渲染页面 user_obj = models.User.objects.filter(id=edit_id).first() #将当前数据渲染到一个编辑页面上 return render(request,'edit.html',locals())

settings

from django.shortcuts import render,HttpResponse,redirectfrom app01 import models# Create your views here.import pymysqldef logins(request):    # return HttpResponse('login')    #获取用户端提交的请求方式    print(request.method)    #post 请求会报错,就要到settings中将某个东西注掉   拿到请求方式是全大写的    # if request.method == 'GET':    #     return render(request,'logins.html')    # elif request.method == 'POST':    #     return HttpResponse('来了,laodi')    # < QueryDict: {'username': ['jason'], 'password': ['123']} >    # < QueryDict: {'username': ['yaya', 'yaya'], 'password': ['123']} >    if request.method == 'POST':        # 获取用户输入的用户名和密码        username=request.POST.get('username')        password=request.POST.get('password')        conn = pymysql.connect(            host='127.0.0.1',            port=3306,            user='root',            password='123',            database='day55',            charset='utf8',            autocommit=True        )        cursor = conn.cursor(pymysql.cursors.DictCursor)        cursor.execute("select * from app01_user where name=%s and password=%s",(username,password))        user_info=cursor.fetchall()        print(user_info)        if user_info:            return HttpResponse('登录成功')        print(request.POST)  #你就把它当成一个大字典里面存放了客户端post提交的所有提交数据        # request.POST:< QueryDict: {'username': ['jason'], 'password': ['123']} >        print(request.POST.get('username'))  # value 虽然是个列表但是获取的value 的时候拿到的是单个元素        # # 默认只会取value列表里面的最后一个元素        # print(request.POST.getlist('username'))  # 要想一次性获取value列表里面所有的数据需要用getlist()        #要想一次性获取value列表里面的所有数据要用getlist()        print(request.POST.getlist('name'))#不推荐使用该        print(request.POST['password'])        print(request.GET) #get请求数据的方式跟post请求完全一样  
# 获取get请求数据的方式跟post请求完全一样!!! return HttpResponse('ok') return render(request,'logins.html')def reg(request): if request.method == 'POST': #获取用户输入的用户名和密码 username=request.POST.get('username') password=request.POST.get('password') #操作数据库user表 #方式1 user_obj = models.User.objects.create(name=username,password=password) #方式2: user_obj = models.User(name=username,password=password) user_obj.save()#对象用save方法保存到数据库 print(user_obj.pk) #获取主键值,无论你的主键字段叫什么名字 print(user_obj.password) # 获取用户数据的password值 print(user_obj.name) #获取用户数据的name值 #内部重定向,可以写别人的网址,也可以自己的网址 return redirect('/user') return render(request,'reg.html')def user(request): #获取数据库数据 user_list = models.User.objects.all() #select id,name,password from User print(user_list.query) #只要是QuerySet就可以点query查看获取到当前query对象的内部sql语句 for user_obj in user_list: print(user_obj.pk,user_obj.name) # return HttpResponse('ok') return render(request,'user.html',locals())def delete_user(request): #从get请求携带的参数中获取用户想要删除的信息id delete_id = request.GET.get('delete_id') # res=models.User.objects.filter(id=delete_id).first() models.User.objects.filter(id=delete_id).delete() #会将queryset所有对象全部删除 # res=models.User.objects.filter(id=delete_id)[0] # print(res) #相当于
]> # print(res.query) # print(type(res)) return redirect('/user')def edit(request): if request.method == 'POST': print(request.GET) print(request.POST) username= request.POST.get('username') password = request.POST.get('password') #获取用户想要修改用户的的数据id edit_id = request.POST.get('edit_id') edit_id= request.GET.get('edit_id') #将该数据查询出来渲染到一个编辑页面 #查询数据方式一 # user_query = models.User.objects.filter(id=edit_id).first() #查询数据方式2 # user_obj = models.User.objects.get(id=edit_id) #用get可以直接获取到数据对象本身 # print(user_query.type(user_query)) # return HttpResponse('edit') # 更新数据库 models.User.objects.filter(id=edit_id).update(name=username,password=password) return redirect('/user') #获取用户想要修改的数据的id edit_id = request.GET.get('edit_id') #将该数据查询出来渲染到一个渲染页面 user_obj = models.User.objects.filter(id=edit_id).first() #将当前数据渲染到一个编辑页面上 return render(request,'edit.html',locals())

urls

"""login URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:    https://docs.djangoproject.com/en/2.1/topics/http/urls/Examples:Function views    1. Add an import:  from my_app import views    2. Add a URL to urlpatterns:  path('', views.home, name='home')Class-based views    1. Add an import:  from other_app.views import Home    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')Including another URLconf    1. Import the include() function: from django.urls import include, path    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))"""from django.contrib import adminfrom django.urls import pathfrom app01 import viewsurlpatterns = [    path('admin/', admin.site.urls),    path('logins/', views.logins),    path('reg/', views.reg),    path('user/',views.user),    path('delete_user/',views.delete_user),    path('edit/',views.edit)]

wsgi

"""WSGI config for login project.It exposes the WSGI callable as a module-level variable named ``application``.For more information on this file, seehttps://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/"""import osfrom django.core.wsgi import get_wsgi_applicationos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'login.settings')application = get_wsgi_application()

edit

    
Title

编辑数据

username:

password:

logins

    
Title

login

登录页面

登录页面

username:

{#

username:

#}

password:

reg

    
Title

注册页面

username:

password:

user

    
Title

展示数据

{% for user_obj in user_list %}
{% endfor %}
id name password
{ { user_obj.pk }} { { user_obj.name }} { { user_obj.password }} 编辑 删除

转载于:https://www.cnblogs.com/huangxuanya/p/10987698.html

你可能感兴趣的文章
Android学习笔记-保存数据的实现方法2-SharedPreferences
查看>>
python接口自动化1
查看>>
java this关键字
查看>>
JAVA8之数据流Stream
查看>>
关于控制反转(IOC)容器 ,依赖注入(DI)模式必读文章收集
查看>>
20131214-EditPlus快捷键-第二十一天
查看>>
安装Windows服务,一直提示系统正在关机的错误。
查看>>
wake,awake,waken,awaken的区别
查看>>
MySQL 字符串拼接
查看>>
iOS-回收键盘的几种方法
查看>>
knockoutJS学习笔记09:使用mapping插件
查看>>
API开发之接口安全(二)-----sign校验
查看>>
bzoj 1047 单调队列
查看>>
Windows Phone开发之路(11) 方向处理之动态布局
查看>>
数据分析笔试题
查看>>
Random在高并发下的缺陷以及JUC对其的优化
查看>>
C# 获取文件路径,读取项目中某程序集下文件
查看>>
static关键字
查看>>
Java面向对象之接口interface 入门实例
查看>>
想成为web开发大神?那你应该从拥有良好的代码规范走起!(JavaScript篇 - 第一篇)...
查看>>