forward相关知识
-
forward,include,redirect学习forward: 有两个接口带有RequestDispatcher getRequestDispatcher(String path)方法 Java代码 javax.servlet.ServletContext.getRequestDispatcher(String path) javax.servlet.ServletRequest.getRequestDispatcher(String path) javax.servlet.RequestDispatcher有两个方法: Java代码 void include(ServletRequest request, ServletResponse response) 其中这里的path必须开始为"/",即这里的path必须相对于context的root. Java代码 void forward(ServletRequest request,
-
JAVA常见面试题之Forward和Redirect的区别(转载自两位作者)1.从地址栏显示来说 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址. redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL. 2.从数据共享来说 forward:转发页面和转发到的页面可以共享request里面的数据. redirect:不能共享数据. 3.从运用地方来说 forward:一般用于用户登陆的时候,根据角色转发
-
TensorFlow-3: 用 feed-forward neural network 识别数字这一节讲了使用 MNIST 数据集训练并评估一个简易前馈神经网络(feed-forward neural network)input,output 和前两节是一样的:即划分数据集并预测图片的 labeldata_sets.train 55000个图像和标签(labels),作为主要训练集。data_sets.validation 5000个图像和标签,用于迭代验证训练准确度。data_sets.test 10000个图像和标签,用于最终测试训练准确度(trained accuracy)。主要有两个代码:mnist.pyhttps://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist.py构建一个全连接网络,由 2 个隐藏层,1 个 `softmax_linearv 输出构成定义损失函数,用 `cro
-
总结:直接请求转发(Forward)和间接请求转发(Redirect)的区别用户向服务器发送了一次HTTP请求,该请求可能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求,但是用户是感觉不到请求转发的。根据转发方式的不同,可以区分为直接请求转发(Forward)和间接请求转发(Redirect),那么这两种转发方式有何区别呢?一、从定义上看:forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器。浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址。 redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址。所以地址栏显示的是新的URL。所以redirect等于客户端向服务器端发出两次request,同时也接受两次response。二、 从原理上看:Forward(直接转发方式)用的更多一些,一般说的请求转发指的就是直接转发方式。Web应用程序大多会有一个控制器。由控制器来控制请求应该转发给那个信息资源。然后由这些信息资源处理请求,处理完以后
forward相关课程
forward相关教程
- 3.2 @forward @forward 的工作原理和 @use 基本相同,都是用于加载文件内容的,不过 @forward 可以跨多个文件来组成一个 Sass 库,一般在写一个开源的 Sass 样式库的时候你可能会用到它,在项目中是不常用的。在这里我们举个简单的例子来感受下,假如我在 src/a.scss 中定义了一个 mixin ,代码如下所示:// src/a.scss @mixin bor { width: 100px; height: 100px;}然后我在 b.scss 中使用 @forward 来导入它,代码如下所示:// b.scss@forward 'src/a';最终呢,我是想在和 b.scss 同级的 c.scss 文件中使用 a.scss 中的 mixin,那么在 c.scss 中我们可以不直接导入 a.scss,我们通过导入 b.scss 也可以实现,c.scss 中的代码如下所示:// c.scss@use "b";li { // 应用 a.scss 文件中的 mixin @include b.bor;}从上面的代码中可以看出来我们可以通过 @forward 来组合多个文件的内容,然后提供给其他的样式中使用,类似于转发的功能,同时它还可以控制某些成员的私有访问等,不过这个一般是写大型的样式库才会用到,在入门教程中我们不做过多的探讨。
- 2.1 SkipList 数据结构 面试官提问: Redis zset 数据结构的底层实现是什么?为什么要使用跳跃表?题目解析:在介绍跳跃表(SkipList,简称跳表)之前,我们可以以单链表数据结构作为对比。 (单链表结构示意图)在单链表中,我们查询一个元素的时间复杂度是 O (N),其中 N 是链表的长度,因为需要诶个遍历节点,单链表不支持数组的随机插入和删除,也不支持数组的自动排序,显然不适合作为 zset 的实现方式。跳跃表的基础定义可参考维基百科定义参考定义,我们给出 C 语言的结构体定义:typedef struct zskiplistNode { sds ele; double score; struct zskiplistNode *backward; struct zskiplistLevel { struct zskiplistNode *forward; unsigned int span; } level[];} zskiplistNode;typedef struct zskiplist { struct zskiplistNode *header, *tail; unsigned long length; int level;} zskiplist;候选人需要描述跳表的数据结构,可以通过画图或者其他方式给出定义。 (典型的跳跃表结构,图片来自网络,侵删)从结构体可以看出,节点有不同的定义:sds:存储的字符串对象;score:分数,跳表中所有节点按照 score 由大到小排列;backward:指向后退节点的指针;forward:指向下一个节点的指针;level:数组,数组中的每一个元素包括了指向其他节点的指针,level 的长度在 1 到 32(2^5)之间。其中跳表的主要组成结构有:表头:表示跳表的入口;表尾:表示跳表的尾部,数值全部都是 NULL;节点:保存具体数值,并且具有层结构;层:就是上述 level 定义中的单个元素,保存前一个节点的指针,以及该层下个节点向前跨越的数值(span)。跳表的查询过程本质上是自上而下的二分查找,插入和查询过程都相对复杂,这里不做赘述。在阐述基本定义之后,我们需要关注跳跃表的核心特点:本质是随机化数据结构,可以在对数(logN)时间内完成对数据的查找、插入、删除操作;跳跃表在 Redis 的唯一应用,就是作为有序集合支撑底层数据结构。
- 2.1 Django 中和上传文件相关的基础类 这一节主要是来分析下 Django 中和上传文件相关的代码。首先介绍下几个基础类:FileProxyMixin 类:用于辅助文件上传的 mixin 类。来看看其源码长相:# 源码路径: django/core/files/utils.pyclass FileProxyMixin: """ A mixin class used to forward file methods to an underlaying file object. The internal file object has to be called "file":: class FileProxy(FileProxyMixin): def __init__(self, file): self.file = file """ encoding = property(lambda self: self.file.encoding) fileno = property(lambda self: self.file.fileno) flush = property(lambda self: self.file.flush) isatty = property(lambda self: self.file.isatty) newlines = property(lambda self: self.file.newlines) read = property(lambda self: self.file.read) readinto = property(lambda self: self.file.readinto) readline = property(lambda self: self.file.readline) readlines = property(lambda self: self.file.readlines) seek = property(lambda self: self.file.seek) tell = property(lambda self: self.file.tell) truncate = property(lambda self: self.file.truncate) write = property(lambda self: self.file.write) writelines = property(lambda self: self.file.writelines) @property def closed(self): return not self.file or self.file.closed def readable(self): if self.closed: return False if hasattr(self.file, 'readable'): return self.file.readable() return True def writable(self): if self.closed: return False if hasattr(self.file, 'writable'): return self.file.writable() return 'w' in getattr(self.file, 'mode', '') def seekable(self): if self.closed: return False if hasattr(self.file, 'seekable'): return self.file.seekable() return True def __iter__(self): return iter(self.file)注意:可以看到,想要继承这个 Mixin 并正常使用,继承的类应该有实例属性 file。这里 Mixin 中的属性和我们在 Python 中用 open()方法得到的文件对象的属性几乎一致,后面实验中可以得到佐证。File 类:专门为上传文件的定义的基类,直接看源代码。class File(FileProxyMixin): DEFAULT_CHUNK_SIZE = 64 * 2 ** 10 def __init__(self, file, name=None): self.file = file if name is None: name = getattr(file, 'name', None) self.name = name if hasattr(file, 'mode'): self.mode = file.mode def __str__(self): return self.name or '' def __repr__(self): return "<%s: %s>" % (self.__class__.__name__, self or "None") def __bool__(self): return bool(self.name) def __len__(self): return self.size @cached_property def size(self): if hasattr(self.file, 'size'): return self.file.size if hasattr(self.file, 'name'): try: return os.path.getsize(self.file.name) except (OSError, TypeError): pass if hasattr(self.file, 'tell') and hasattr(self.file, 'seek'): pos = self.file.tell() self.file.seek(0, os.SEEK_END) size = self.file.tell() self.file.seek(pos) return size raise AttributeError("Unable to determine the file's size.") def chunks(self, chunk_size=None): """ Read the file and yield chunks of ``chunk_size`` bytes (defaults to ``File.DEFAULT_CHUNK_SIZE``). """ chunk_size = chunk_size or self.DEFAULT_CHUNK_SIZE try: self.seek(0) except (AttributeError, UnsupportedOperation): pass while True: data = self.read(chunk_size) if not data: break yield data def multiple_chunks(self, chunk_size=None): """ Return ``True`` if you can expect multiple chunks. NB: If a particular file representation is in memory, subclasses should always return ``False`` -- there's no good reason to read from memory in chunks. """ return self.size > (chunk_size or self.DEFAULT_CHUNK_SIZE) # ... def open(self, mode=None): if not self.closed: self.seek(0) elif self.name and os.path.exists(self.name): self.file = open(self.name, mode or self.mode) else: raise ValueError("The file cannot be reopened.") return self def close(self): self.file.close()这里就能看到我们之前在实验1中用来保存上传文件时用到的 chunks() 方法,我们现在通过 Django 的命令行模式来使用下这个 File 类,看它有哪些功能。(django-manual) [root@server first_django_app]# python manage.py shellPython 3.8.1 (default, Dec 24 2019, 17:04:00) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linuxType "help", "copyright", "credits" or "license" for more information.(InteractiveConsole)>>> from django.core.files import File接下来,我们看到 File 类实例化时要关联一个文件对象,我们使用之前实验1上传的文件 upload.txt 作为实例化参数:>>> fp = open('/root/test/django/upload.txt', 'r+')>>> f = File(fp)接下来我们就可以测试 File 对象中的各种属性和方法了。具体操作如下:>>> f.name'/root/test/django/upload.txt'>>> f.size47# 按照20字节大小,判断文件需不需要分块读入>>> f.multiple_chunks(20)True# 默认块大小64k,47字节太小了,所以不用分块读入>>> f.multiple_chunks()False我们可以使用 chunks() 方法分块读取文件内容,然后做我们想做的事情,如下:>>> for c in f.chunks():... print('本次读入:{}'.format(c))... 本次读入:测试上传文件xxxxxspyinx test upload>>> for c in f.chunks(20):... print('本次读入:{}'.format(c))... 本次读入:测试上传文件xxxxxspyinx本次读入: test upload上面测试了2种形式,一种不需要分块读如数据,一口气读完所有内容(因为默认的分块大小大于文件内容)。另一种则设置小一些分块大小,这样会每次读取最多20字节内容,依次打印读取到的内容。接下来我们看下和上传相关的两个文件类:TemporaryUploadedFile 和 InMemoryUploadedFile。这两个类都是继承自 UploadedFile,而 UploadedFile 又是继承至 File 类的。# 源码路径: django/core/files/uploadedfile.pyclass UploadedFile(File): """ An abstract uploaded file (``TemporaryUploadedFile`` and ``InMemoryUploadedFile`` are the built-in concrete subclasses). An ``UploadedFile`` object behaves somewhat like a file object and represents some file data that the user submitted with a form. """ def __init__(self, file=None, name=None, content_type=None, size=None, charset=None, content_type_extra=None): super().__init__(file, name) self.size = size self.content_type = content_type self.charset = charset self.content_type_extra = content_type_extra def __repr__(self): return "<%s: %s (%s)>" % (self.__class__.__name__, self.name, self.content_type) def _get_name(self): return self._name def _set_name(self, name): # Sanitize the file name so that it can't be dangerous. if name is not None: # Just use the basename of the file -- anything else is dangerous. name = os.path.basename(name) # File names longer than 255 characters can cause problems on older OSes. if len(name) > 255: name, ext = os.path.splitext(name) ext = ext[:255] name = name[:255 - len(ext)] + ext self._name = name name = property(_get_name, _set_name)这个类相比于 File 基类主要是增加了多个实例属性,其他方法到没啥变化。接下里来看继承这个类的两个 File 类:class TemporaryUploadedFile(UploadedFile): """ A file uploaded to a temporary location (i.e. stream-to-disk). """ def __init__(self, name, content_type, size, charset, content_type_extra=None): _, ext = os.path.splitext(name) file = tempfile.NamedTemporaryFile(suffix='.upload' + ext, dir=settings.FILE_UPLOAD_TEMP_DIR) super().__init__(file, name, content_type, size, charset, content_type_extra) def temporary_file_path(self): """Return the full path of this file.""" return self.file.name def close(self): try: return self.file.close() except FileNotFoundError: # The file was moved or deleted before the tempfile could unlink # it. Still sets self.file.close_called and calls # self.file.file.close() before the exception. passclass InMemoryUploadedFile(UploadedFile): """ A file uploaded into memory (i.e. stream-to-memory). """ def __init__(self, file, field_name, name, content_type, size, charset, content_type_extra=None): super().__init__(file, name, content_type, size, charset, content_type_extra) self.field_name = field_name def open(self, mode=None): self.file.seek(0) return self def chunks(self, chunk_size=None): self.file.seek(0) yield self.read() def multiple_chunks(self, chunk_size=None): # Since it's in memory, we'll never have multiple chunks. return False这两段代码非常简单,代码展现的逻辑也非常清晰。TemporaryUploadedFile 打开的文件是临时生成的文件,而 InMemoryUploadedFile 类对于上传的文件会保存到内存中。我们熟悉了这两个类之后来对应的处理上传文件的 Handler,一个会使用 TemporaryUploadedFile 类使用临时文件保存上传的文件,另一个会使用 InMemoryUploadedFile 将上传文件的内容写到内存中:class TemporaryFileUploadHandler(FileUploadHandler): """ Upload handler that streams data into a temporary file. """ def new_file(self, *args, **kwargs): """ Create the file object to append to as data is coming in. """ super().new_file(*args, **kwargs) # 这个文件是打开临时文件的句柄 self.file = TemporaryUploadedFile(self.file_name, self.content_type, 0, self.charset, self.content_type_extra) # 将受到的数据写入到对应的临时文件中 def receive_data_chunk(self, raw_data, start): self.file.write(raw_data) # 处理文件完毕 def file_complete(self, file_size): # 文件指针,指向初始位置 self.file.seek(0) # 设置文件大小 self.file.size = file_size return self.fileclass MemoryFileUploadHandler(FileUploadHandler): """ File upload handler to stream uploads into memory (used for small files). """ def handle_raw_input(self, input_data, META, content_length, boundary, encoding=None): """ Use the content_length to signal whether or not this handler should be used. """ # Check the content-length header to see if we should # If the post is too large, we cannot use the Memory handler. self.activated = content_length <= settings.FILE_UPLOAD_MAX_MEMORY_SIZE def new_file(self, *args, **kwargs): super().new_file(*args, **kwargs) if self.activated: self.file = BytesIO() raise StopFutureHandlers() def receive_data_chunk(self, raw_data, start): """Add the data to the BytesIO file.""" if self.activated: self.file.write(raw_data) else: return raw_data def file_complete(self, file_size): """Return a file object if this handler is activated.""" if not self.activated: return self.file.seek(0) return InMemoryUploadedFile( file=self.file, field_name=self.field_name, name=self.file_name, content_type=self.content_type, size=file_size, charset=self.charset, content_type_extra=self.content_type_extra )
- 5-2 查询部门分页数据(后端) 企业级在线办公系统
- ECharts 极坐标系 掌握数据可视化,让数据更美观
- 9-7 几个常见的内存操作函数 深度剖析C语言知识体系
forward相关搜索
-
face
fade
fadein
fadeout
fadeto
fail
family
fastcgi
fastjson
fault
fclose
fdisk
feed
fetch
ff浏览器
fgets
fields
fieldset
fighting
figure