Django前戏与介绍

Django前戏

纯手撸web框架

HTTP协议	网路传输协议 数据传输是明文的
HTTPS协议 	数据传输是秘闻的
websocket协议		数据传输是密文

四大特性
 	基于请求响应
 	基于TCP、IP作用于应用层之上的协议
	无状态
	短 /无链接

数据格式
	请求首行
 	请求头
 	\r\n
 	请求体

借助于wsgiref模块

#### 基础
from wsgiref.simple_server import make_server
def run(evn,response):
   '''
   :param evn: 请求相关的所有数据
   :param response: 响应相关的所有数据
   :return: 返回鬼浏览器的数据
   '''
   response('200 OK', [])
   current_path = evn.get('PATH_INFO')  # 获取到输入的后缀,也就是路由
   return [b'nihao']
if __name__ == '__main__':
   server = make_server('127.0.0.1',8080,run)
   '''会实时监听127.0.0.1:8080地址,只要有客户端过
   来都会交给run函数处理,加括号后触发函数运行'''
   server.serve_forever()  # 启动服务器
#####

urls.py    路由与视图函数对应关系(路由:加载地址后面的那个后缀)
views.py     视图函数(后端业务逻辑)
templates	 专门用来存储html文件
# 按照功能的不同拆分之后,后续添加功能只需要在urls.py书写对应关系,然后去views.py书写业务逻辑即可

动静态网页

  • 静态网页
    • 页面上的数据是直接写死的,万年不变
  • 动态网页
    • 数据是实时更新的,
      1. 后端获取当前时间展示到html页面上
      2. 数据是从数据库中获取的展示到html页面上
# 动态网页制作
import datetime
def get_time(env):
    current_time = datetime.datetime.now().strftime('%Y-%m-%d %X')
    # 如何将后端获取到的数据"传递"给html文件?
    with open(r'templates/03 mytime.html','r',encoding='utf-8') as f:
        data = f.read()
        # data就是一堆字符串
    data = data.replace('dwadasdsadsadasdas',current_time)   # 在后端将html页面处理好之后再返回给前端
    return data

# 将一个字典传递给html文件 并且可以在文件上方便快捷的操作字典数据
from jinja2 import Template
def get_dict(env):
    user_dic = {'username':'jason','age':18,'hobby':'read'}
    with open(r'templates/04 get_dict.html','r',encoding='utf-8') as f:
        data = f.read()
    tmp = Template(data)
    res = tmp.render(user=user_dic)
    # 给get_dict.html传递了一个值 页面上通过变量名user就能够拿到user_dict
    return res

# 后端获取数据库中数据展示到前端页面

模板语法之jinja2模块

pip3 install jinja2
"""模版语法是在后端起作用的"""

# 模版语法(非常贴近python语法)
{{ user }}
{{ user.get('username')}}
{{ user.age }}
{{ user['hobby'] }}


{% for user_dict in user_list %}
    <tr>
        <td>{{ user_dict.id}}</td>
        <td>{{ user_dict.username}}</td>
        <td>{{ user_dict.password}}</td>
        <td>{{ user_dict.hobby}}</td>
    </tr>
{% endfor%}

web请求流程

wsgiref模块

  1. 请求来的时候解析HTTP格式的数据,封装成大字典
  2. 响应走的时候给数据打包成符合HTTP格式,再返回给浏览器

Django介绍

Python三大主流框架

  1. Django
    • 特点:大而全,自带的功能特别特别的多,
    • 不足:有时过于笨重
  2. flask
    • 特点:小而精,自带功能特别少,第三方模块特别多,如果将flask第三方模块全加起来,完全可以盖过Django
    • 不足:比较依赖于第三方的开发者
  3. tornado
    • 特点:异步非阻塞,支持高并发,牛逼到可以开发游戏服务器
    • 不足:暂时不会

Django的注意事项

  1. 如何能让自己计算机正常的启动Django项目
    1. 计算机名称不能有中文
    2. 一个pycharm窗口只开一个项目,不要文件夹套文件夹
    3. 项目里的所有文件尽量不要出现中文
    4. Python解释器尽量使用3.4~3.6之间的版本
    5. 如果项目报错,点击最后一个报错信息,去源代码中吧逗号删掉
  2. Django版本问题
    • 1.X 2.X 3.X(最新版本)
    • 1.X和2.X本身差距也不大
    • 公司之前用的1.8 有一些项目用的2.0
  3. django安装
    • pip3 install django==1.11.11
      如果已经安装了其他版本 无需自己卸载,直接重新装 会自动卸载安装新的
    • 如果报错 看看是不是timeout 如果是 那么只是网速波动,重新安装即可
    • 验证是否安装成功的方式:终端输入django-admin看看有没有反应

Django基本操作

# 命令行操作
	# 1.创建Django项目
    django-admin startproject mysite
    
    # 2.启动Django项目
    	# 一定要先切换到项目目录下
    python3 manage.py runserver
    # 默认是http://127.0.0.1:8080
    
    # 3. 创建应用
    pytho3 manage.py startapp app01
    	# 应用名应该见名知意:user,order,web

# pycharm操作
	# 1.创建:new project 选择Django项目即可
    
    # 2.启动:可以命令行启动,也可以绿色箭头启动
    
    # 3.创建应用
    	1.pycharm提供的终端直接输入完整命令
    	2.pycharm 
      		tools 
        		run manage.py task提示(前期不要用 给我背完整命令)
	# 4 修改端口号以及创建server	
		edit confi....
        

Django中的应用

"""
django是一款专门用来开发app的web框架

django框架就类似于是一所大学(空壳子)
app就类似于大学里面各个学院(具体功能的app)
	比如开发淘宝
		订单相关
		用户相关
		投诉相关
		创建不同的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创建项目的时候 pycharm可以帮你创建一个app并且自动注册

主要文件介绍

-mysite项目文件夹
	--mysite文件夹
		---settings.py	配置文件
		---urls.py			路由与视图函数对应关系(路由层)
		---wsgi.py			wsgiref模块(不考虑)
	--manage.py			    django的入口文件
	--db.sqlite3			django自带的sqlite3数据库(小型数据库 功能不是很多还有bug)
	--app01文件夹
        ---admin.py			 django后台管理
    	---apps.py			注册使用
    	---migrations文件夹  数据库迁移记录
    	---models.py		数据库相关的 模型类(orm)
  		---tests.py			测试文件
    	---views.py			视图函数(视图层)

命令行与pycharm创建区别

# 1 命令行创建不会自动有templatew文件夹 需要你自己手动创建而pycharm会自动帮你创建并且还会自动在配置文件中配置对应的路径
# pycharm创建
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
]
# 命令行创建
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
]
"""
也就意味着你在用命令创建django项目的时候不单单需要创建templates文件夹还需要去配置文件中配置路径
'DIRS': [os.path.join(BASE_DIR, 'templates')]
"""

Django小白必会三板斧

'''
1. HttpResponse
	返回字符串类型
	 return HttpResponse("OK")
	 
2. render
	返回HTML文件
	 return render(request, "index.html", data)
	
3. redirect
	重定向
	return redirect('https://www.mzitu.com/')
	return redirect('/home/')
''' 

静态文件配置

'''
我们将html文件默认都放在templates文件夹下
将网站所使用的静态文件默认放在static文件夹下
静态文件:
	前端已经写好的,能够直接调用使用的文件
		js
		css
		图片
		第三方前端框架
		...
		拿来就直接使用的
		
Django默认是不会自动创建static文件夹的,需要自己手动创建
一般情况下在static文件夹内还会做进一步的划分处理,将js,css,图片等分文件夹存放
		
'''
"""
在浏览器中输入url能够看到对应的资源
是因为后端提前开设了该资源的借口
如果访问不到资源 说明后端没有开设该资源的借口

http://127.0.0.1:8000/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
"""

# 静态文件配置

"""
****************************************************************
当你在写django项目的时候 可能会出现后端代码修改了但是前端页面没有变化的情况
	1.你在同一个端口开了好几个django项目 
		一直在跑的其实是第一个django项目
	
	2.浏览器缓存的问题
		settings
			network
				disable cache 勾选上	
*****************************************************************
"""

STATIC_URL = '/ooo/'  # 类似于访问静态文件的令牌
"""如果你想要访问静态文件 你就必须以static开头"""
"""
/static/bootstrap-3.3.7-dist/js/bootstrap.min.js

/static/令牌
取列表里面从上往下依次查找
    bootstrap-3.3.7-dist/js/bootstrap.min.js
    都没有才会报错
"""
# 静态文件配置
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
    os.path.join(BASE_DIR,'static1'),
    os.path.join(BASE_DIR,'static2'),
]

# 静态文件动态解析
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
    
    
# form表单默认是get请求数据
	http://127.0.0.1:8000/login/?username=jason&password=123
"""
form表单action参数
	1.不写 默认朝当前所在的url提交数据
	2.全写 指名道姓
	3.只写后缀 /login/
"""


# 在前期我们使用django提交post请求的时候 需要取配置文件中注释掉一行代码
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

request对象方法初识

request.method # 返回请求方式 并且是全大写的字符串形式  <class 'str'>
request.POST  # 获取用户post请求提交的普通数据不包含文件
	request.POST.get()  # 只获取列表最后一个元素
	request.POST.getlist()  # 直接将列表取出
request.GET  # 获取用户提交的get请求数据
	request.GET.get()  # 只获取列表最后一个元素
	request.GET.getlist()  # 直接将列表取出
"""
get请求携带的数据是有大小限制的 大概好像只有4KB左右
而post请求则没有限制
"""
  
def login(request):
    # 返回一个登陆界面
    """
    get请求和post请求应该有不同的处理机制
    :param request: 请求相关的数据对象 里面有很多简易的方法
    :return:
    """
    # print(type(request.method))  # 返回请求方式 并且是全大写的字符串形式  <class 'str'>
    # if request.method == 'GET':
    #     print('来了 老弟')
    #     return render(request,'login.html')
    # elif request.method == 'POST':
    #     return HttpResponse("收到了 宝贝")
    
    if request.method == 'POST':
        return HttpResponse("收到了 宝贝")
    return render(request, 'login.html')

框架设计模型(MTV与MVC)

MTV
	M: models 模型层
	T:templates 模板层
	V:views 视图层

MVC
	M:models 模型层
	V:views 视图层
	C:controller 控制层

Django框架自称是MTV,本质也是MVC框架

Django的本地化(国际化)配置

LANGUAGE_CODE = 'zh-hans'
# S 必须大写(windows平台可以小写)
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

\

posted @ 2021-06-30 20:18  zheng-sn  阅读(55)  评论(0)    收藏  举报